トップページ⇒tech
1001コメント275KB

C言語なら俺に聞け! Part 106

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2005/04/10(日) 12:08:35
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

各種リンク、関連スレは>>2-13あたり

C言語なら俺に聞け! Part 105
http://pc8.2ch.net/test/read.cgi/tech/1111117094/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
0002デフォルトの名無しさん2005/04/10(日) 12:09:38
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.cygwin.com/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/
Visual C++ Developer Center: Microsoft Visual C++ Toolkit 2003
http://msdn.microsoft.com/visualc/vctoolkit2003/

【ライセンスや機能などに問題あり】
Microsoft C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
Intel C++ Compiler for Linux
http://developer.intel.com/software/products/compilers/clin/noncom.htm
0003デフォルトの名無しさん2005/04/10(日) 12:13:40
重複やん
Part106 http://pc8.2ch.net/test/read.cgi/tech/1112845322/
0004デフォルトの名無しさん2005/04/10(日) 14:08:30
4さま
000552005/04/10(日) 14:11:15
>>1
どれだけ遅れて重複させてるんだよw
0006デフォルトの名無しさん2005/04/10(日) 14:32:39
>>5
1 名前:デフォルトの名無しさん 投稿日:2005/04/07(木) 12:42:02
000752005/04/10(日) 14:53:44
>>6
親切だなおまいは…。
0008デフォルトの名無しさん2005/04/21(木) 23:48:22
教えてください。
途中で条件を満たさなかったら以降は実行しない処理を書きたいのです。

if (a != 0)
{
return 1;
}
if (b != 0)
{
return 1;
}
・
・

と、ずらずらと書いているのですがスマートじゃないですね。
実際にはa、bのところに関数の処理を入れて戻り値を使っているのですが、
どうも格好悪いのです。

if ((a != 0) || (b != 0) || ........)
{
return 1;
}

こうすればプログラムの行数は短くなりますが、どっちにしろスマートじゃないです。
何か良い方法はないでしょうか?
0009デフォルトの名無しさん2005/04/22(金) 00:16:15
>>8
では、どうあればスマートだと思うのかね。
0010デフォルトの名無しさん2005/04/22(金) 21:11:45
>>8
if (a)
{
    if (b)
    {
        if (c)
            ;
    }
}
0011デフォルトの名無しさん2005/04/30(土) 17:01:30
0012デフォルトの名無しさん2005/04/30(土) 19:26:24
配列に汁
0013デフォルトの名無しさん2005/04/30(土) 19:30:26
再利用ってことでage
0014デフォルトの名無しさん2005/04/30(土) 19:55:12
>>8
>if ((a != 0) || (b != 0) || ........)
>{
>return 1;
>}
まぁ、今さら見てるか分からんが、全て0に対しての比較なら

if(a|b)return 1;
0015デフォルトの名無しさん2005/04/30(土) 20:00:12
前スレ807ですが
http://pc8.2ch.net/test/read.cgi/tech/1112845322/812
812氏のソースの変数bufを配列にして
カンマがくると、それまでの内容を格納し
またカンマがくると次の配列に格納するようにしたいのですが、
while ((ch = fgetc(fp)) != EOF)
{
if(ch == ',') cnt2++;
buf[cnt2][cnt++] = ch;
}
for(i = 0; i < cnt2; i++)
buf[i][cnt] = '\0';
fclose(fp);
for(i = 0; i < cnt2; i++)
printf("%s", buf[i]);
上手く次の配列に格納できません。
なぜ上手くいかんのか、図々しいですが教えてくださいませ。
0016デフォルトの名無しさん2005/04/30(土) 20:14:07
>>15
while((ch=fgetc(fp))!=EOF){
if(ch==','){buf[cnt2++][cnt]='\0';cnt=0}
else{buf[cnt2][cnt++]=ch;}}
0017デフォルトの名無しさん2005/04/30(土) 20:31:21
>16
ありがとうございます。解決しました
0018デフォルトの名無しさん2005/04/30(土) 20:41:23
人はどこへ行くのですか?
0019デフォルトの名無しさん2005/04/30(土) 21:19:32
>>18
そのとき向いている方向。

だから自分はどこを向いているのか、どこまで先を見ているかを意識しておくとよい。
最初はわずかな誤差でも、時間が経つにつれ、大きく変わるからな。
何か目標を作って、そこを常に目指すやり方でもいいが、たまに足元を見ないと
落とし穴が出来ている可能性もあるから注意な。

で、誤爆か?
0020デフォルトの名無しさん2005/04/30(土) 21:21:22
>>18
大阪の新世界
0021デフォルトの名無しさん2005/04/30(土) 23:05:11
>>14
if(a|b) は if(a||b) とは違うぞ。
0022デフォルトの名無しさん2005/04/30(土) 23:08:45
>>21
それが何か?
0023デフォルトの名無しさん2005/05/01(日) 00:23:21
>>21
保守があれだけどコメント書いておけばまあ大丈夫っしょ。
0024デフォルトの名無しさん2005/05/01(日) 01:14:22
>>14の方法だと、常にbが評価されないか?
副作用を気にしないのならいいが。
0025デフォルトの名無しさん2005/05/01(日) 01:31:43
>>8の「a、bのところに」って言葉が
文字通り「a、b」のところであれば、bを評価するのはまずいが、
>if (a != 0)
>{
>/* この部分 */
>return 1;
>}
であれば、問題ないね
まぁ、a,bを特殊な使い方をしてる可能性はあるし、
意表をついて、ポインタや、実数である可能性も否定出来ないが、
なんにしろ、>>8がいなければ、意味がない議論やね…
0026デフォルトの名無しさん2005/05/01(日) 08:25:08
8がいても、何がどうなってるときにどうなるのか理解できないだろうから意味が無い罠。
0027デフォルトの名無しさん2005/05/01(日) 15:14:40
BIOSでS.M.A.R.Tを有効にする
0028デフォルトの名無しさん2005/05/01(日) 16:04:03
既存ソフトの簡単なソースコードを読んでみたいと思うのですが、
どこか配布してる場所は無いでしょうか?
0029デフォルトの名無しさん2005/05/01(日) 16:05:30
>>28
sourceforge
0030デフォルトの名無しさん2005/05/01(日) 16:07:13
>>29
質はいいと思うんですが、初心者の私にはちょっと大きすぎるのです。
ソースコードを投稿形式で募集して公開してたサイトが昔あったと思うんですが、
そういうサイトありませんでしょうか?
0031デフォルトの名無しさん2005/05/01(日) 16:09:38
>>30
ぼるじょあスレ
0032デフォルトの名無しさん2005/05/01(日) 16:13:33
ttp://www.north-wind.ne.jp/~yoshino/contents.htm 投稿P検索
0033デフォルトの名無しさん2005/05/01(日) 16:13:36
>>30
現実から目をそむけたければそむければいい
君はそのたびに自らの可能性をつぶすのだ
0034デフォルトの名無しさん2005/05/01(日) 17:22:27

アキバが変わる!? 〜近未来予想図〜
http://www.zakzak.co.jp/tsui-sat/tsui/0430_01.htm
0035デフォルトの名無しさん2005/05/01(日) 18:52:50
質問してもいいですか?
0036デフォルトの名無しさん2005/05/01(日) 18:58:30
>>35
スレ違いの質問じゃないなら是非。
0037デフォルトの名無しさん2005/05/01(日) 19:51:27
じゃあ質問することにします。
0038デフォルトの名無しさん2005/05/01(日) 19:59:45
void hoge( int test1, int test2, int test3 )
{}

int main()
{
int a = 5 ;
hoge( a, a, a ) ;
}

このように、同じ変数をたくさん与えて、問題ないものですか?
不安です。
0039デフォルトの名無しさん2005/05/01(日) 20:03:42
問題ない
0040デフォルトの名無しさん2005/05/01(日) 20:05:56
ありがとうございます
0041デフォルトの名無しさん2005/05/01(日) 20:38:13
質問でする。

#include <stdio.h>
#include <string.h>

int main()
{
char data[64];
while(1) {
scanf("%s", data);
if (strcmp(data, "E") == 0)
break;
}
return 0;
}

Eを入力したらwhileをぬけるようになってるんですが、
これをEnterをおしただけでぬけるようにするにはどうしたらいいのでしょうか?
0042デフォルトの名無しさん2005/05/01(日) 20:42:45
int c;
while(c = getchar(),c != EOF && c != '\n') ;
0043デフォルトの名無しさん2005/05/01(日) 20:45:30
int a(){
static int b=0;
return ++b;
}

こんな関数があったとき、
printf( "%d %d %d\n",a(), a(), a() );
これって未定義だっけ? 不定? どっちだろう
0044デフォルトの名無しさん2005/05/01(日) 20:49:33
ふてぃ

参考
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa7.html
0045デフォルトの名無しさん2005/05/01(日) 20:58:27
未定義の
二つの副作用完了点の間に、オブジェクトの値を2回以上変更している場合
に当たらないのだろうか。
0046デフォルトの名無しさん2005/05/01(日) 21:10:27
関数引数のどれから評価されるかわからない(しちゃいけない)部分を不定というと思うけど、

この場合bというオブジェクトは a() 呼び出しの副作用として3回インクリメントされるだけ。
0047デフォルトの名無しさん2005/05/01(日) 21:24:43
#include <stdio.h>

void inputNum(int *x, int *y) {
  scanf("%d", *x);
  scanf("%d", *y);
}

int main(void) {
  int x, y;
  inputNum(&x, &y);
  printf("%d, %d", x, y);
  return 0;
}

inputNum関数で整数値を2つ受け取って、mainに返したいんですがうまくいきません。
0048デフォルトの名無しさん2005/05/01(日) 21:27:48

void inputNum(int *x, int *y) {
  scanf("%d", x);
  scanf("%d", y);
}
0049デフォルトの名無しさん2005/05/01(日) 21:32:57
>>48
おお!ありがとうございます!
でもなんで そうしたらできるんだろう?
x,yはmain関数の変数なのに
0050デフォルトの名無しさん2005/05/01(日) 21:38:58
宿題すれからようこそ。
その scanf() にわたしているのは inputNum() の2つの引数だよ。
main() の変数とは違うことを意識するために、以下みたいに変数名を変えて動作させてみて。

void inputNum(int *a, int *b) {
  scanf("%d", a);
  scanf("%d", b);
}

scanf() に int 変数のアドレス a を渡す
scanf() に int 変数のアドレス b を渡す

( main()はinputNum()に対し、int 変数 x と y のアドレスを渡してる )
実際に自分で理解してください。
0051デフォルトの名無しさん2005/05/01(日) 21:45:33
CにSTLのような標準コンテナライブラリは無いんですか?
0052デフォルトの名無しさん2005/05/01(日) 21:48:36
ないです
0053デフォルトの名無しさん2005/05/01(日) 22:00:26
>>50
なんとなく理解しました!どうもです!
0054デフォルトの名無しさん2005/05/01(日) 22:14:42
>>45
>二つの副作用完了点の間に、オブジェクトの値を2回以上変更している場合
>に当たらないのだろうか。
普通の関数であれば、基本的には、
副作用はその関数内で完了するので、未定義にはならない
この場合は評価順が決まってないだけなので、結果は不定のはず…
まぁ、a()がinlineで宣言されてた場合の振る舞いはどうなるか分からんが…
0055412005/05/01(日) 22:17:02
>>42サンクス
でも、思ったとおりに動きません。
ソースを省略しすぎたみたいなので

while(1) {
  printf("data[%3d] = ", n++);
  scanf("%s", data);
  if (strcmp(data, "E") == 0)
    break;
  sum += atof(data);  
}
printf("合計 = %f\n", sum);

合計を求めるんですが終了条件を
Eを入力するのではなくEnterを押しただけで終了させたいわけです。
>>42の通りにやると一回の入力しかできないで終了してしまいます。
0056デフォルトの名無しさん2005/05/01(日) 22:18:55
環境依存のにほいが…
0057デフォルトの名無しさん2005/05/01(日) 22:42:46
>>55
  while(1) {
    printf("data[%3d] = ", n);
    if(!fgets(data, sizeof(data), stdin) || strcmp(data, "\n") == 0)
      break;
    if(sscanf(data, "%f", &f) != 1)
      continue;

    sum += f;
    n++;
  }
  printf("合計 = %f\n", sum);
0058デフォルトの名無しさん2005/05/01(日) 22:47:29
Cに標準コルーチンライブラリは無いんですか?
0059デフォルトの名無しさん2005/05/01(日) 22:49:13
>>58
代わりにstatic変数とswitch文があります。
0060412005/05/02(月) 00:18:40
>>57できました。ありがとうございます。
0061デフォルトの名無しさん2005/05/02(月) 01:07:52
Cって何かの略ですか?
0062デフォルトの名無しさん2005/05/02(月) 01:09:15
>>61
Bの次
0063デフォルトの名無しさん2005/05/02(月) 01:13:11
>>62
違う。
0064デフォルトの名無しさん2005/05/02(月) 01:14:53
Assembler
Basic
C
D
次はなんだろう
0065デフォルトの名無しさん2005/05/02(月) 01:17:46
>>64
D++とか出て
Eが出てくるかとw
0066デフォルトの名無しさん2005/05/02(月) 01:53:31
>>64
Aに再帰しまふ
0067デフォルトの名無しさん2005/05/02(月) 01:54:40
その前にDって完成するの?
0068デフォルトの名無しさん2005/05/02(月) 02:13:54
D危ういな
0069デフォルトの名無しさん2005/05/02(月) 03:43:26
Dぉだろう
0070デフォルトの名無しさん2005/05/02(月) 14:17:58
激しくガイシュツな気がするんですがスレが見つからないんで質問させてください。
Excelのセルごとのデータを入力したいんですが、どうしたらよいでしょうか。。
今のところexcelからタブ区切りでファイル出力して、プログラムでfgetcしていって、
タブが見つかればそこまでを文字列としてるんですが、もっときれいにできたらいいなと思いまして。。
0071デフォルトの名無しさん2005/05/02(月) 14:18:47
structが2重定義を避けるために、
この名前の構造体が定義されてなければ定義する、
という書き方は出来ますか?
0072デフォルトの名無しさん2005/05/02(月) 14:38:34
int stat()でファイルサイズを取得したいんですがどうすればできますか?
OSはリナックスです。
0073デフォルトの名無しさん2005/05/02(月) 14:58:21
最小二乗法を用いた回帰式もとめるプログラム
どうすればいいですかね?
0074デフォルトの名無しさん2005/05/02(月) 15:03:20
>>71
多重定義するとエラーが出るだろ。
0075デフォルトの名無しさん2005/05/02(月) 15:04:10
>>72
man読めよ。
0076デフォルトの名無しさん2005/05/02(月) 15:07:55
>>73
どういう回帰式?
0077712005/05/02(月) 15:09:30
>>74
いろんなコンパイラで通るようにしたいです。

定数定義されてるかどうかだったら、
#ifndef A
#define A 1
#endif
とか書けますよね。

#構造体定義されてなかったら、
Struct A 〜
#endif
みたいなことがしたいです。
0078デフォルトの名無しさん2005/05/02(月) 15:13:39
>>72
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>

int main () {
struct stat st;
stat ("test108.c", &st);
printf ("%d", (int) st.st_size);
return 0;
}
0079732005/05/02(月) 15:14:52
>>76
回帰直線でした。x、yの2つの値から最小二乗法で
y=ax+bの形の回帰直線をつくりたいんです。
とりあえずデータはテキストファイルに
Xの値、Yの値が1行ずつはいってるんですが
0080デフォルトの名無しさん2005/05/02(月) 16:41:31
inti = 7;

void *p = &i;
void **pp = &p;
void ***ppp = &pp;

printf("ppp = %d\n", ppp);
printf("*ppp = %d\n", *ppp);
printf("**ppp = %d\n", **ppp);

printf("***ppp = %d\n", ***ppp); // *1
printf("***ppp = %d\n", *((int*)**ppp)); // *2

VC.net2003だと、*1の行だけがコンパイルエラーになるんでつが、
やってる事は*2と同じだと思うのでつけど原因は何でしょうか。
0081デフォルトの名無しさん2005/05/02(月) 16:44:30
void
0082デフォルトの名無しさん2005/05/02(月) 16:48:35
>>71
その構造体を定義しているヘッダファイルを(読み込んでなければ)読み込むようにすればいい。
0083デフォルトの名無しさん2005/05/02(月) 16:54:38
voidポインタで示されたメモリ領域のサイズは不明
だからprintfで*1のように書いてもエラーになる。
*2のように明示的にキャストしてあげないといけない。
と述べてみるテスト
0084デフォルトの名無しさん2005/05/02(月) 17:02:37
>>81>>83
void***〜void*はアドレスのサイズなのに対して
voidはサイズが不明だからキャストすらできないんでつね。 原因わかったよ、�dくすこ。
0085デフォルトの名無しさん2005/05/02(月) 17:59:00
>>84
サイズが不明だからではない
ボイド式の値を使ってはならないからだ
噛み砕いて言うなら表現形式が不明ゆえ定義域と値域を写像できない
なお void* は不完全型の1つでボイド式にはあたらない
表現形式は処理系定義のビット列つまり既知である
0086デフォルトの名無しさん2005/05/02(月) 19:20:45
>>77
#pragma once

↑これはどうだ?
0087デフォルトの名無しさん2005/05/02(月) 19:29:30
>>86
少しずれてるよ
0088デフォルトの名無しさん2005/05/02(月) 20:05:56
#スメグマ ワンス
0089デフォルトの名無しさん2005/05/02(月) 20:20:46
コンパイラが __inline をサポートしているかどうかを調べる方法ってありますか?
0090デフォルトの名無しさん2005/05/02(月) 20:36:19
>>89
マニュアル読む=処理系定義
0091862005/05/02(月) 20:55:10
_|\○_ >>86
0092デフォルトの名無しさん2005/05/02(月) 21:25:37
#include<stdio.h>
以下のプログラム実行してみると結果が

0123456789

となる理由がさっぱりわかりません。
なぜでしょか?

main(){

int i;

for(i = 0;i < 10;i++)
printf("%c",i["0123456789"]);
}
0093デフォルトの名無しさん2005/05/02(月) 21:29:05
>>92
C FAQに書いてある。
0094デフォルトの名無しさん2005/05/02(月) 21:34:53
>>92
i["0123456789"]と"0123456789"[i]は同じ。
文字列リテラルはchar配列だから添え字演算子[]が使える。
0095デフォルトの名無しさん2005/05/02(月) 21:54:25
ループ毎に"0123456789"のi番目を表示している
0096デフォルトの名無しさん2005/05/02(月) 21:58:12
"0123456789"[i] と書けと言いたい。
0097デフォルトの名無しさん2005/05/02(月) 22:09:03
char str[11];
のとき
10[str]でも問題ないのだよ。
Cは最低だなプッ
0098デフォルトの名無しさん2005/05/02(月) 22:11:00
#define ANYvoid*
voidalloc(ANY* p, int* n, int d, int size)
{
--d;
if(d)
{
p = (ANY*)malloc(sizeof(void*)*n[0]); //配列をあろけぇと
for(int i = 0; i < n[0];++i)
alloc((ANY*)(p[i]), &(n[1]), d, size);//子配列をあろけぇと
}else{
p = (ANY*)malloc(size*n[0]); //最後の配列をあろけぇと
}
}
int main()
{
int **ppi;
int num[] = {3, 4};
int d = 2;
alloc((ANY*)ppi, num, d, sizeof(int));
for(int i = 0; i < 3; ++i)
for(int j = 0; j < 4; ++j)
ppi[i][j] = 0;
return 0;
}
動的にn次元の配列を確保する関数を作ってみようと思ったんですが
なんかエラーっぽいんでつ。 どこが間違ってますか?
0099デフォルトの名無しさん2005/05/02(月) 22:40:47
>>93-97
なるほど、ありがとうございました。
0100デフォルトの名無しさん2005/05/02(月) 22:47:14
>>98
で、なにがしたいって?
0101デフォルトの名無しさん2005/05/03(火) 00:27:03
%cってなんですか?
0102デフォルトの名無しさん2005/05/03(火) 00:29:21
1文字
0103デフォルトの名無しさん2005/05/03(火) 00:29:46
人文字?
01041022005/05/03(火) 00:31:11
文字1つ
0105デフォルトの名無しさん2005/05/03(火) 00:44:14
文字列と配列の違いを教えて下さい。
0106デフォルトの名無しさん2005/05/03(火) 00:48:41
>>105
文字列…文字の配列
配列…ブヒっ
0107デフォルトの名無しさん2005/05/03(火) 00:48:44
Cでは文字の配列で最後に'\0'(NUL文字)なら文字列
0108デフォルトの名無しさん2005/05/03(火) 00:51:02
\0は実際のところ、八進数なんですか?
0109デフォルトの名無しさん2005/05/03(火) 00:51:39
零元です
0110デフォルトの名無しさん2005/05/03(火) 03:29:45
C言語でウィンドウ表示するとかできるんスか?
ってゆうか、この言語無駄に難しい気が。。。
0111デフォルトの名無しさん2005/05/03(火) 03:34:23
>>110
ホームラン級の馬鹿だな
0112デフォルトの名無しさん2005/05/03(火) 03:43:30
ジャンガジャンガジャンガジャンガジャンガジャンガジャンガジャンガジャンガジャンガジャンガジャーン
0113デフォルトの名無しさん2005/05/03(火) 08:52:38
>>98
typedef void *ANY;
void alloc(ANY* pp, int* n, int d, int size)
{
    --d;
    if (d)
    {
        *pp = (ANY)malloc(sizeof (void*) * n[0]); //配列をあろけぇと
        for (int i = 0; i < n[0]; ++i)
        {
            alloc((void **)*pp + i, n + 1, d, size);//子配列をあろけぇと
        }
    }
    else
    {
        *pp = (ANY)malloc(size * n[0]); //最後の配列をあろけぇと
    }
}
int main()
{
    int num[] = {3, 4};
    int d = 2;
    int **ppi;
    alloc((ANY *)&ppi, num, d, sizeof (int));
    for(int i = 0; i < 3; ++i)
        for(int j = 0; j < 4; ++j)
            ppi[i][j] = 0;
    return 0;
}
0114デフォルトの名無しさん2005/05/03(火) 12:11:24
>110が比較対象にしてる簡単な言語ってのが何か非常に気になる。
Win32APIが無駄に難しいという事なら同意。
0115デフォルトの名無しさん2005/05/03(火) 12:15:02
Win32API が無駄に難しいって初めて聞いた
0116デフォルトの名無しさん2005/05/03(火) 14:18:03
>>113
れす、ありがとうございます。
関数にポインタ渡ししてなかったのが原因でしたか。。。
初歩的ミスでしたね。
0117デフォルトの名無しさん2005/05/03(火) 14:21:22
下手な #define 休むに似たり
0118デフォルトの名無しさん2005/05/03(火) 14:44:41
最新のC言語の規格はどこで手に入りますか?
0119デフォルトの名無しさん2005/05/03(火) 14:48:17
>>118

ちょっと閲覧
http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3010

正式に入手
http://www.webstore.jsa.or.jp/webstore/Com/FlowControl.jsp?bunsyoId=JIS+X+3010%3A2003&dantaiCd=JIS&status=1&pageNo=0&lang=jp
0120デフォルトの名無しさん2005/05/03(火) 14:48:23
>>118
ISO
0121デフォルトの名無しさん2005/05/03(火) 14:51:41
>>118 変更などの確認ならば、下記
http://seclan.dll.jp/c99d/c99d00.htm
0122デフォルトの名無しさん2005/05/03(火) 16:30:54
質問です。
char型2次元配列に文字列を格納したテーブルがあります。

y
x 'a' 'r' 'a' 'f' 'f' 'g' 'e' 'a' '\n' '\0'
't' 'u' 't' 'e' 'w' 'a' '\n' '\0'
'q' 'r' 'x' 'a' 'b' '\n' '\0'

わかりにくくてすいません。イメージとしてはこんな感じです。
この中から'\n'だけ取り除くプログラムを作りたいのですが、
どうしてもわかりません。
よろしければヒントだけでも教えてくれると助かります。
0123デフォルトの名無しさん2005/05/03(火) 16:50:02
>>122
「取り除く」とはどのように?
0124デフォルトの名無しさん2005/05/03(火) 16:58:10
>>122
int remove_char (char* dst, char* src, char c) {
char* p = dst;
while (*src) {
if (*src != c) {*p = *src; p++;}
src++;
}
*p = '\0';
return strlen (dst);
}

int main () {
char str[256];
remove_char (str, "test", 'e');
printf ("%s", str);
return 0;
}
01251222005/05/03(火) 17:38:01
>>124
ありがとうございます!とても便利な関数ですね。

>>123
「取り除く」とは'\n'を削除して'\0'を一つ前に詰めるという意味です。
大事なことをわかりづらく書いてしまってすいません。
0126デフォルトの名無しさん2005/05/03(火) 17:55:10
なんで strlen なんか呼んでるんだ?

# あえて疑問文で書いているが答えはおおかた予想している
0127デフォルトの名無しさん2005/05/03(火) 19:00:38
>>126
ごめんなさい。
初めは整数型iを増やしていたんだけど、ポインタにしちゃった。
0128デフォルトの名無しさん2005/05/03(火) 19:09:43
先生に「ゲーム作りたいならC言語をやれ」って言われCを始めました。
C/C++を一通り学習し終えたのですが、GUI画面ってどう作るのですか・・・?
0129デフォルトの名無しさん2005/05/03(火) 19:16:05
ここで聞くより、その先生に聞いたほうが早い
0130デフォルトの名無しさん2005/05/03(火) 19:18:31
>>128
>>1の3行目を音読しれ
0131デフォルトの名無しさん2005/05/03(火) 19:25:37
>>130
すみません、3行目は空行です
0132デフォルトの名無しさん2005/05/03(火) 19:26:06
ワロタ
0133デフォルトの名無しさん2005/05/03(火) 19:31:31
>>131
馬鹿には見えない文字コードが使われてます。
0134デフォルトの名無しさん2005/05/03(火) 19:37:11
やべえ、おれも見えねー
0135デフォルトの名無しさん2005/05/03(火) 19:41:24
音読したら帰ってよし
0136デフォルトの名無しさん2005/05/03(火) 19:45:09
最初は0行目です
0137デフォルトの名無しさん2005/05/03(火) 20:08:07
>>127
p-dst
0138デフォルトの名無しさん2005/05/03(火) 20:13:23
GW中にどうやって先生に聞くんですか?
0139デフォルトの名無しさん2005/05/03(火) 20:14:35
>>138
あなたを、先生です。
0140デフォルトの名無しさん2005/05/03(火) 20:15:24
>>138
それこそ先生に聞け
0141デフォルトの名無しさん2005/05/03(火) 20:16:29
>>140
あなたを、先生です。
0142デフォルトの名無しさん2005/05/03(火) 20:53:50
>>136
かなり納得した。
0143凡人プ・・・2005/05/03(火) 21:20:05
■無限ループってどうやって書くのですか?( ・∀・)∩
0144デフォルトの名無しさん2005/05/03(火) 21:23:03
>>143
無限ループ
0145デフォルトの名無しさん2005/05/03(火) 21:23:14
>>143
whie(1){}とかfor(; ; ){}とか。どちらでもよし。趣味。
0146デフォルトの名無しさん2005/05/03(火) 21:34:50
goto もあるぞ
0147デフォルトの名無しさん2005/05/03(火) 21:38:08
>>143
>>147
0148デフォルトの名無しさん2005/05/03(火) 21:42:35
#include<setjmp.h>
main()
{
jmp_bufjb;
setjmp(jb);
longjmp(jb, 1);
}
0149デフォルトの名無しさん2005/05/03(火) 21:54:42
microsoft visual c++ を使っています
演算子のオーバーロードを目的としフレンド関数を定義したのですが、内部コンパイラエラーがでます。
エラー番号(c1001)をたどってmsdnで調べてみたのですが、
漠然としていて、いまいち良く分かりませんでした。
やさしいc++という本のコードを丸写ししていて、写しミスが無いか何度も確認したのですが見付かりません。
どなたか解決方法を知っていましたら、教えてください。
それとスレ違いだったらごめんなさい。
それと携帯からの投稿でごめんなさい。
0150デフォルトの名無しさん2005/05/03(火) 22:00:22
http://pc8.2ch.net/test/read.cgi/tech/1113539594/
ここへ行くといいかも
0151デフォルトの名無しさん2005/05/03(火) 22:08:34
>>150
そっちでしたか。
ありがとんくす。
携帯で2chやることに、早くも限界を感じてきたので、またあとで質問しに行こうと思います。
ここに足跡として、携帯オリジナルの絵文字を残して行きます。


0152デフォルトの名無しさん2005/05/03(火) 22:10:27
内部コンパイラエラーっつーのも妙だな

void operator ! (struct hoge)
{
}

を恣意的に解釈すると
型指定子 void に続いて識別名が operator てなところまではパースできていて、
その次のトークン ! がマッチングしないってだけだろ
0153デフォルトの名無しさん2005/05/03(火) 22:18:44
1から9までの数字を重複しないように割り当てたいのですが、
どのようにすればよいのかわかりません。
教えてください。
0154デフォルトの名無しさん2005/05/03(火) 22:23:50
>>153
リスト
0155デフォルトの名無しさん2005/05/03(火) 22:24:04
>>153
ばらばらにつけるとメドイから
2重にforをりようしれ
0156デフォルトの名無しさん2005/05/03(火) 22:24:07
1-9まで配列なりなんなりに入れて順番にとりだす
ランダムにしたいのなら配列をシャッフルというか宿題スレにいったほうが
0157デフォルトの名無しさん2005/05/03(火) 22:25:40
char a[] = {1,2,3,4,5,6,7,8,9};
01581282005/05/03(火) 22:33:13
>>129
なかなか会えない人でね。
>>130
「GUIなどの標準Cではできない事」
え・・・ちょっと次の言語探してみますね。失礼しました。
0159デフォルトの名無しさん2005/05/03(火) 22:37:55
猫池
0160デフォルトの名無しさん2005/05/03(火) 22:38:42
Cでのゲームの作り方なんざ検索すればたくさん出てくると思うんだが
01611532005/05/03(火) 22:39:50
>>154,155
初心者なのでいまいち分かりません。具体的におしえていただきたのですが。
>>156
毎回ランダムにきまるようにしたいのです。
シャッフルはどのようにやるのでしょうか?
0162デフォルトの名無しさん2005/05/03(火) 22:40:29
fflush関数についてなんですが、
fflush(stdout);
とするとバッファの内容が標準出力へ強制的に出力されますが、
fflish(stdin);
とした場合、標準入力へ書き出すということになるんでしょうか?
そうだとすると、標準入力へ出力とはどういうことなのでしょうか?
(フラッシュというものの概念がそもそもよくわかってないのですが・・・)

よろしくお願いします。
0163デフォルトの名無しさん2005/05/03(火) 22:42:20
>>161
rand()
0164デフォルトの名無しさん2005/05/03(火) 22:44:41
>>162

>>1にある
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
に書いてある
0165デフォルトの名無しさん2005/05/03(火) 22:46:43
スレ違いだが
>>152
MSDN (民明書房デベロッパーズノート) によると
「主にC++ コンパイル時に出現する。『標準に準拠してなくて御免なさい』の意」
だそうだ。
0166デフォルトの名無しさん2005/05/03(火) 23:10:07
>>161
こんな感じ

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void shuffle( int *a, int n )
{
int temp, r, max = n ;
while( --n ) {
r = rand() % max ;
temp = a[n] ; a[n] = a[r] ; a[r] = temp ;
}
}
int main( void )
{
int a[] = { 1, 2, 3, 4, 5 } ;

srand( (unsigned)time( NULL ) ) ;
shuffle( a ,sizeof a / sizeof *a ) ;

for( int i = 0 ; i < 5 ; i++ )
printf( "%d\n" ,a[i] ) ;

}
0167デフォルトの名無しさん2005/05/03(火) 23:18:48
>>166
最低だな
0168デフォルトの名無しさん2005/05/03(火) 23:26:59
どの辺が?
煽るだけなら簡単だよねー
0169デフォルトの名無しさん2005/05/03(火) 23:28:41
すみません、質問です。
ここの板みて思ったんですけど、>>98ってあんな事して何か意味があるんですか?
0170デフォルトの名無しさん2005/05/03(火) 23:37:18
>>168
>どの辺が?
考え方が
要素数を百程度にして、実際の出現率を計算してみな
0171デフォルトの名無しさん2005/05/03(火) 23:37:42
>>169
許してやれよ
0172デフォルトの名無しさん2005/05/03(火) 23:43:17
出現率・・・つーと、ランダムの分布に偏りが出るとかそう言うことっすかね。
そこまで頭回らんですよ・・・
0173デフォルトの名無しさん2005/05/03(火) 23:50:36
13.16:
ある範囲の整数からなる乱数はどうやったら生成することができるか。
A:
すぐに思い付く、
rand() % N /* タコ */
(これは0からN-1までの数を返そうとする)は乱数の質が低い。なぜなら乱数発生器の多くで下位のビットは悲しいほどランダムでない(質問13.18を参照のこと)。よりよい方法は以下のようなものである。
(int)((double)rand() / ((double)RAND_MAX + 1) * N)
浮動小数を使うことが気になるのなら、以下の方法を試せばよい。
rand() / (RAND_MAX / N + 1)
どちらの方法もRAND_MAX(ANSIは<stdlib.c>で定義している)の値を知っていることが当然必要である。またどちらもNがRAND_MAXにくらべて十分小さいことを仮定している。
(ところで、RAND_MAXはCライブラリのrand()関数が返す値の範囲を表わす定数である。RAND_MAXを他の値に変更することはできないし、rand()に別の範囲の数を返すように指定することもできない。)
0から1の間の小数を返す乱数発生器を元にするなら、単にその乱数発生器の出力にNを掛けると0からN-1の範囲の乱数発生器が得られる。
References: K&R2 Sec. 7.8.7 p. 168; PCS Sec. 11 p. 172.
0174デフォルトの名無しさん2005/05/03(火) 23:57:21
>>173
>>166は、それ以前の問題
01751732005/05/03(火) 23:59:28
別に 166 でも問題ないと思われるが?
0176デフォルトの名無しさん2005/05/04(水) 00:01:52
あるよ
0177デフォルトの名無しさん2005/05/04(水) 00:04:07
では正しい解答をお願いします
0178デフォルトの名無しさん2005/05/04(水) 00:05:11
乱数の精度を気にするならメルセンヌツイスター持ってくると言う手もある。
0179デフォルトの名無しさん2005/05/04(水) 00:10:53
--nで疑問持たないのか
0180デフォルトの名無しさん2005/05/04(水) 00:14:19
乱数の質は良いに越したことはないけど、アルゴリズムが微妙だからあんまりいい結果にはならないと思う
0181デフォルトの名無しさん2005/05/04(水) 00:17:03
>>179
疑問をもつ貴方に疑問を持ちます。
たしかにおかしな記述ではあるが間違ってはいないはず
0182デフォルトの名無しさん2005/05/04(水) 00:17:53
>179

もしかして 0 になるとループ終了してしまうから、ってこと?
そんなん気にするなよ(w
0183デフォルトの名無しさん2005/05/04(水) 00:20:12
>181

>たしかにおかしな記述ではあるが
そんな貴方に疑問をもちます
0184デフォルトの名無しさん2005/05/04(水) 00:24:51
> --nで疑問持たないのか
どう疑問を持ったのでしょう、ほら言って御覧なさい。
じっくりと訊いて差し上げましょう。
01851622005/05/04(水) 00:29:44
>>164
FAQの確認を忘れておりました。ありがとうございます。
0186デフォルトの名無しさん2005/05/04(水) 00:29:52
>>179
君は親切すぎる。アホが気付くまで待ってやれって。
0187デフォルトの名無しさん2005/05/04(水) 00:29:59
>179

要素数 と 配列のインデクス(添え字) の区別はついてるよね?
0188デフォルトの名無しさん2005/05/04(水) 00:30:04
ソースみて分からん奴は、main()を↓に変えて実行汁

#define NUM 1000
int main() {
int t[NUM], i ;
for(i=0;i<NUM;i++){
  t[i]=i+1;}
srand((unsigned)time(NULL));
shuffle(a,sizeof(t)/sizeof(t[0]));
for(i=0;i<NUM;i++) printf("%d ",a[i]);
return 0 ;}
0189デフォルトの名無しさん2005/05/04(水) 00:31:19
typo
>shuffle(a,sizeof(t)/sizeof(t[0]));
shuffle(t,sizeof(t)/sizeof(t[0]));
0190デフォルトの名無しさん2005/05/04(水) 00:31:34
同意
0191デフォルトの名無しさん2005/05/04(水) 00:32:12
>>173
「乱数発生器の多く」の特性に依存する方がよっぽどタコだ
乱数発生器をわざわざ関数にする意味がまるでわかってねえな
0192デフォルトの名無しさん2005/05/04(水) 00:34:57
>>190
小さくなるだろうなw
0193デフォルトの名無しさん2005/05/04(水) 00:35:33
動きゃいいんだよ、動きゃーよー!
揚げ足とりのような細かい部分ばかり気がいくんだからさー
正直参っちゃうね
0194デフォルトの名無しさん2005/05/04(水) 00:36:13
184 名前:デフォルトの名無しさん[sage] 投稿日:2005/05/04(水) 00:24:51
> --nで疑問持たないのか
どう疑問を持ったのでしょう、ほら言って御覧なさい。
じっくりと訊いて差し上げましょう。
01951732005/05/04(水) 00:37:30
別に rand() そのまま使っても致命的な問題は発生せんけど
知ってて見ないふりをしてそのままにするより、手当てする方が好みなんで
0196デフォルトの名無しさん2005/05/04(水) 00:39:19
そこまで気にするならMT法かハードウェアを利用しないか普通
0197デフォルトの名無しさん2005/05/04(水) 00:40:37
今どき、そんなに品質の悪い乱数発生器って少いんじゃないの?
0198デフォルトの名無しさん2005/05/04(水) 00:41:33
>>194
俺が困る事は全くないのでかまわないが
shuffle(a,0);
0199デフォルトの名無しさん2005/05/04(水) 00:44:25
>198

まさにあげあしとりだw
0200デフォルトの名無しさん2005/05/04(水) 00:48:20
そこが問題じゃなかろうw
0201デフォルトの名無しさん2005/05/04(水) 00:49:41
>>199
だから、俺は困らないから、別にかまわないと書いている
0202デフォルトの名無しさん2005/05/04(水) 00:57:24
で、結局何が問題なの?
0203デフォルトの名無しさん2005/05/04(水) 00:59:24
>>195
>別に rand() そのまま使っても致命的な問題は発生せんけど

(,,゚Д゚)ハァ?
0204デフォルトの名無しさん2005/05/04(水) 01:00:19
>>202
a[0]がswapの対象になるのは乱数で選ばれた時だけ
0205デフォルトの名無しさん2005/05/04(水) 01:01:02
リストにして素直に摘んでいけば良いのに
0206デフォルトの名無しさん2005/05/04(水) 01:01:28
みんなが黙っていたことを…
0207デフォルトの名無しさん2005/05/04(水) 01:01:39
問題がある、と主張する香具師は、「問題」そのものを主張していない
問題がない、と主張したい香具師は「問題」が示されていないのでコメントしようがない

それが問題
0208デフォルトの名無しさん2005/05/04(水) 01:02:14
>>204
なんで言っちゃうかな
0209デフォルトの名無しさん2005/05/04(水) 01:03:17
>>204
もう少し遊びたかったのにw
02101952005/05/04(水) 01:04:33
>a[0]がswapの対象になるのは乱数で選ばれた時だけ

やっぱりそれが致命的とは思えんな
そもそも配列全体数回swapする必要はないだろ?
0211デフォルトの名無しさん2005/05/04(水) 01:06:24
2つずつ置き換えてるからあんまりバラけないんだよね
精度のいい乱数つかうなら>>205が正解
実装の手間はともかく
0212デフォルトの名無しさん2005/05/04(水) 01:07:40
1000回は引っ掛けだったのか。
0213デフォルトの名無しさん2005/05/04(水) 01:08:06
>実装の手間

ポイントはこれだな
0214デフォルトの名無しさん2005/05/04(水) 01:09:23
リストは面倒だからね…
0215デフォルトの名無しさん2005/05/04(水) 01:10:09
出た数字がバラバラじゃないとか、乱数の意味が分かってないぞ
0216デフォルトの名無しさん2005/05/04(水) 01:10:42
乱数が均等だとして、期待値を取ればa[0]だけ小さくなる。
気にしない人は気にしないんだろうが。
0217デフォルトの名無しさん2005/05/04(水) 01:11:09
リストの意味がわかってないぞ
0218デフォルトの名無しさん2005/05/04(水) 01:11:42
規格の存在意義すらわかってないらしい
0219デフォルトの名無しさん2005/05/04(水) 01:14:42
この世に意味なんてない
0220デフォルトの名無しさん2005/05/04(水) 01:18:53
>>219
そういうことは哲板で言え。
0221デフォルトの名無しさん2005/05/04(水) 01:25:38
誰もn--にすれば良いとか言わないのな…
0222デフォルトの名無しさん2005/05/04(水) 01:26:35
>知ってて見ないふりをしてそのままにするより、手当てする方が好みなんで

>>a[0]がswapの対象になるのは乱数で選ばれた時だけ
>やっぱりそれが致命的とは思えんな


...もまえさん分裂しとるだ
0223722005/05/04(水) 01:35:21
>>78さん

すっきり理解できました。
なんか丁寧にありがとうございます。恐縮です・・
0224デフォルトの名無しさん2005/05/04(水) 01:35:58
リストのどこが面倒なんだろう
0225デフォルトの名無しさん2005/05/04(水) 01:37:22
C++とSTLで全然面倒じゃないじゃん
0226デフォルトの名無しさん2005/05/04(水) 01:37:53
>225

C++ならな
0227デフォルトの名無しさん2005/05/04(水) 01:38:03
ここはCスレですよ
0228デフォルトの名無しさん2005/05/04(水) 01:38:53
だからCはクソなんだよ
苦労しなくていいところで苦労する
こんな言語使ってる香具師はアホだろw
0229デフォルトの名無しさん2005/05/04(水) 01:39:22
リストなんてCやってれば何度も何度も書くだろ
0230デフォルトの名無しさん2005/05/04(水) 01:40:44
>>229
えっ?
0231デフォルトの名無しさん2005/05/04(水) 01:40:59
>>228
自分で書く無駄な苦労はやめて、ライブラリ使うようにしろ。
0232デフォルトの名無しさん2005/05/04(水) 01:41:43
>苦労しなくていいところで苦労する

それはCに限った話ではないがw
0233デフォルトの名無しさん2005/05/04(水) 01:42:30
慣れれば苦もなく書けるが
最初から使う気のない香具師に覚えろというのは酷かも
0234デフォルトの名無しさん2005/05/04(水) 01:53:16
>216

確認したら
59081/100000 = 59.08%
80133/100000 = 80.13%
81440/100000 = 81.44%
81588/100000 = 81.59%
80180/100000 = 80.18%
こんな感じだった
0235デフォルトの名無しさん2005/05/04(水) 02:02:14
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NUM 9

  int Rand(int i){
  int j,k=RAND_MAX-((RAND_MAX+1)%i);
  while((j=rand())>k);
  return j%i;}

int *make_shuffle(int i){
  int j,k,*p=NULL;
  if(i>0){
    p=calloc(i,sizeof(*p));
    while(i){
      k=Rand(i);j=-1;
      do{while(p[++j])k++;}while(j!=k);
      p[j]=i--;}}
  return p;}

int main(){
  int i,*p;
  srand((unsigned)time(NULL));
  p=make_shuffle(NUM);
  for(i=0;i<NUM;i++)printf("%d\n",p[i]);
  free(p);
  return 0;}
0236デフォルトの名無しさん2005/05/04(水) 02:11:38
純出生過程の乱数を発生させ、パラメータを作り、到着回数を求めるプログラムってどうやって作るの?さっぱり分からない(´・ω・`)F(t)=1-eの-λt乗をつかって作るらしいのですがさっぱり…作れる人いたら作ってほしいっす
0237デフォルトの名無しさん2005/05/04(水) 02:21:53
>>235
そのprocmailみたいなキモイソースのインデントやめて
0238デフォルトの名無しさん2005/05/04(水) 13:24:09
>>235
スタイルの問題なぞ本質ではない、と思っている俺ですら
嫌悪感を覚えるスタイルだなあ。
0239デフォルトの名無しさん2005/05/04(水) 14:29:56
行を節約したかっただけじゃないの
0240デフォルトの名無しさん2005/05/04(水) 15:17:28
節約するとどんないいことが
0241デフォルトの名無しさん2005/05/04(水) 15:27:32
>>240
ここにうpするなら充分にありそうだ
0242デフォルトの名無しさん2005/05/04(水) 17:12:25
書き込みが長ならないように行数を削るのは、ままある話
0243デフォルトの名無しさん2005/05/04(水) 18:10:34
短くしたいのなら、余計なコードを削除すればいい。
includeなんて掲示板に書く例としては必要ないだろ。
0244デフォルトの名無しさん2005/05/04(水) 19:06:32
>>243
>includeなんて掲示板に書く例としては必要ないだろ。

それは「営業」の発想。

もし、「技術者」がサンプルを提示するときは、
表記法が多少おかしくても、必ず「動く」ものを
出してくる。
0245デフォルトの名無しさん2005/05/04(水) 19:12:20
動くコードをなるべく短く載せたかったのかもね
0246デフォルトの名無しさん2005/05/04(水) 19:13:00
>>244
ほほお、なら大半の本はまともな技術者が書いていないということか。
0247デフォルトの名無しさん2005/05/04(水) 19:22:03
動くサンプルとこんな感じだよサンプルは違う
0248デフォルトの名無しさん2005/05/04(水) 20:04:07
WEB制作の板から誘導されてきました!

cgi に文字列を送信するサンプルプログラム、C言語で記述しようと思うのですが、
どなたか簡単なサンプルプログラム作成できる方いらっしゃいませんか?
いくら探しても、私のような初心者にわかりやすいサンプルが見つかりません。
0249デフォルトの名無しさん2005/05/04(水) 20:05:49
>>248
>cgi に文字列を送信する
具体的にどうぞ。
0250デフォルトの名無しさん2005/05/04(水) 20:11:49
その辺って url にパラメータ渡しでやるとかそんな話でなかったっけ?
0251デフォルトの名無しさん2005/05/04(水) 20:14:49
掲示板の仕組みもよくわかってはいないのですが、
2ちゃんねるだったら、書き込むボタンを押したら、
<form method=POST action="../test/bbs.cgi">の
../test/bbs.cgi ってところにデータが送られて、更新されますよね?!
ここに、書き込むボタンを押さずに自分で用意したプログラムからデータ
を送りたいんです。 これじゃわかりませんか?!
0252デフォルトの名無しさん2005/05/04(水) 20:14:55
>>250
それは、cgiが起動するスクリプトにパラメータを引き渡す方法だね。
cgiに文字列を送信することとは違うと思うのだが。
0253デフォルトの名無しさん2005/05/04(水) 20:15:00
>>248
そんなに処理速度が必要でないなら、極力Cは止めた方がいい。
そういう用途にはあまり向かない。
0254デフォルトの名無しさん2005/05/04(水) 20:20:23
では、そのcgiが起動するパラメータに引き渡す方法でもよいです。
いくら検索してもさっぱりわかりません。Perl とかがいいと訊いたことは
ありますが、私はCぐらいしかまともに使ったことがないんです。
もう、この動作を実現するプログラムを作りたくてたまらないのですが、
なにから始めればいいかさっぱりわからんです!
0255デフォルトの名無しさん2005/05/04(水) 20:20:25
入力データをCGIに引き渡す方法(METHOD)として、「GET」と「POST」があります。
このMETHODの指定は、入力フォーム(HTML)上で、<INPUT>タグ内で指定します。
GET METHODは、HTTP/0.9から規定されており、データをサーバに送る手段として、
当時においては唯一の手段でした。ただ、255文字分しか有効にならないという制限がありました。
しかも、URLエンコード(後述)した状態で255文字までですので、複雑なフォームを送信しようとするには限界がありました。
これを改善するかのように、最大有効文字数という制限がない POST という手段が規定されました。
ただ、リクエスト時のHTTPヘッダーに、Content-Lengthヘッダーを含める必要があります。
通常、ブラウザーでの実装となりますので、データを受け取る側のCGIでは考慮する必要はありません。
ただ、CGIからHTTPリクエストを送出する場合には、考慮しなければいけません。
0256デフォルトの名無しさん2005/05/04(水) 20:25:54
CGIはCでなくJavaとPHP(HDML?)を習得しておいた方がいいぞ
鯖に極力負荷をかけないのが大事だ
0257デフォルトの名無しさん2005/05/04(水) 20:26:34
>>254
Cしか書けないとか阿呆なこといってないで、htmlとJavaScriptで書けば?
オーサリングツールを使うまでもなく、数時間勉強するだけでチャット用の固定発言フォームくらい作れるようになるよ。
0258デフォルトの名無しさん2005/05/04(水) 20:27:02
結局Cじゃ無理なんですか・・・
0259デフォルトの名無しさん2005/05/04(水) 20:30:13
このスレをどう読んだらそういう答えになるのか甚だ疑問
0260デフォルトの名無しさん2005/05/04(水) 20:46:46
クリップボードに文字列をコピー
↓
ブラウザのエディットボックスのウィンドウハンドルを得る
↓
マウスカーソルを移動させて文字列を貼り付け
↓
書き込みボタンを押す

こういうの考えてたとしても、面倒くさくて仕方ないです。
もっと一発で出きる関数とかないんですかね?
Cでやりたいんです、とにかくCだけで!
0261デフォルトの名無しさん2005/05/04(水) 20:50:43
>>244
必ずってのは現実とズレてるだろ
サンプルの中に //... なんてフレーズはよく出てくるし
擬似コードと断っているサンプルは全然珍しくない
俺はハードもやるけどもっとひどいの普通にあるぜ
0262デフォルトの名無しさん2005/05/04(水) 20:51:47
>クリップボードに文字列をコピー
>↓
>ブラウザのエディットボックスのウィンドウハンドルを得る
>↓
>マウスカーソルを移動させて文字列を貼り付け
>↓
>書き込みボタンを押す

CGIとどんな関係が? ただのGUIアプリじゃねの?
0263デフォルトの名無しさん2005/05/04(水) 21:00:46
>>260
ソケットを開く
↓
データを送る

で終了だが。
0264デフォルトの名無しさん2005/05/04(水) 22:54:15
cgi c言語
でヤフれ
0265デフォルトの名無しさん2005/05/04(水) 23:09:12
>>254
>もう、この動作を実現するプログラムを作りたくてたまらないのですが
ここに萌えたので教えてあげよう。
TCP/IP で connect して PUT コマンドと
ヘッダ、空白行に続いてエンコード済みのフォームを送出し、
サーバからのレスポンスを受信。
噛み砕いて言うと、ぶっちゃけ(君には)無理。
0266デフォルトの名無しさん2005/05/05(木) 00:28:04
>>260
どっからどうみても、環境依存の問題なので、完全にスレ違い
0267デフォルトの名無しさん2005/05/05(木) 00:30:35
環境依存桶なスレはちゃんとあったはず
0268デフォルトの名無しさん2005/05/05(木) 02:31:15
まずは>255を理解する。
さらに、Cでネットワーク通信をする方法を調べる。
(TCP/IP通信の基礎くらいは学ぶ必要があるだろうな)
んで、一応webブラウザがサーバとの間でどういう通信をしてるのかを調べる。
(自分のPCの通信内容を覗きみるソフトなんぞ探せば簡単に見つかる。
 もしくは、WWWの通信規約をRFCか何かを読んで調べてもいい)
ここまで身に付ければ書ける。つーかこの程度の知識は無いと書けない。

掲示板荒らしスクリプトとかに使われる事が予想される技術。
なんで、悪用を恐れて初心者入門〜みたいなサイトにはあんまりサンプルは無いと思う。
#ってほど難しいもんでも無いけどな。ユーザインターフェース除けば50行未満で最低限のものは作れると思うし
0269デフォルトの名無しさん2005/05/05(木) 16:21:00
そもそも
CGIプログラムがおかれてるマシンの、たぶんwebサーバアプリの入出力が
CGIプログラムの標準出力/標準入力となる、ってのは理解してるのかな?
0270デフォルトの名無しさん2005/05/05(木) 16:44:57
C初心者なんだがスマソン、ちょっと教えてくださいませ。
下のtest関数の"abcd"をmainに返したいんだけど返らないの・・・。
なぜだ、ウガー!って感じ。

int main() {
  char **a;
  test(*a, 10);
  printf("test=%s", *a);

  return 0;
}

int test(char *a, int msize) {
  a = (char* )malloc(msize);
  a = "abcd";
}
0271デフォルトの名無しさん2005/05/05(木) 16:45:28
たしかにCは他の言語に比べれば動作軽いが、
なかなかないんだよな、対応鯖が
0272デフォルトの名無しさん2005/05/05(木) 16:46:30
>>270
もうちょっとポインタの事を勉強しなされ。
0273デフォルトの名無しさん2005/05/05(木) 16:52:09
>270

もまえさんのやりたい事はこんな感じか?
void test(char **a, int msize) {
*a = (char* )malloc(msize);
strcpy(*a,"abcd");
}
int main() {
char *a;
test(&a, 10);
printf("test=%s", a);
return 0;
}
0274デフォルトの名無しさん2005/05/05(木) 17:13:38
>>273
はや!ありがとね。すごいね。
そうか、ポインタのポインタで受けるわけね・・・。
俺みたいなVBな人にはポイポイは難しいのよ。
test関数側をcharのポインタだけで処理しようとしてたから
ずっとうまくいかなかったのかな。。。
完全理解するまでもうちょっと悩みマツ。ありがとうね。
0275デフォルトの名無しさん2005/05/05(木) 17:42:16
>>248
HTTP と言うプロトコルを勉強汁。
後、もっと基礎知識を身に付けろ。
0276デフォルトの名無しさん2005/05/05(木) 17:49:37
>>274
>a = "abcd";
は、VBと違って文字列のコピーはしないからね
0277デフォルトの名無しさん2005/05/05(木) 17:52:37
>275

HTTP? CGIプログラムでなくWebサーバとのやりとりならな
もっと勉強汁。
0278デフォルトの名無しさん2005/05/05(木) 18:09:19
>>277
意味不明
0279デフォルトの名無しさん2005/05/05(木) 18:27:54
>>277
プログラムからフォームデータを送信したい、
と言う話だから HTTP だろう。

藻前は日本語勉強した方がいいぞ。
0280デフォルトの名無しさん2005/05/05(木) 18:32:30
CGI でも HTTP の知識はあった方が良いと思うけどね。
少なくとも HTTP ヘッダを弄ったりするぐらいはするだろうし。

0281デフォルトの名無しさん2005/05/05(木) 19:04:36
それよりもHTMLを(ry
0282デフォルトの名無しさん2005/05/05(木) 19:20:41
これでも嫁
ttp://www.cs.shinshu-u.ac.jp/Lecture/NetworkComputing/main.html
0283デフォルトの名無しさん2005/05/05(木) 19:29:48
>>280
というより、単なるHTTPの問題じゃないの?
CGIかどうかなんて関係なく。
0284デフォルトの名無しさん2005/05/05(木) 19:44:36
元の質問は、cgiにデータを送るプログラムをCで作りたいってことだからな
0285デフォルトの名無しさん2005/05/05(木) 19:48:12
えー、つまりwebサーバなりと通信するクライアントを作りたい、って事?
0286デフォルトの名無しさん2005/05/05(木) 19:51:17
>>260辺りから判断すると、そういうことだろう。
0287デフォルトの名無しさん2005/05/05(木) 19:52:54
スクリプトでどんどん自動投稿したいんです!
0288デフォルトの名無しさん2005/05/05(木) 19:54:01
>263 は読んでないって事?
0289デフォルトの名無しさん2005/05/05(木) 19:54:06
>スクリプトで
なぜCにキタ
0290デフォルトの名無しさん2005/05/05(木) 19:57:08
なんか知らんけど、
> もう、この動作を実現するプログラムを作りたくてたまらないのですが、
とか
> Cでやりたいんです、とにかくCだけで!
とかが俺のツボで、腹が痛いんだけど、どうしてくれるよ。
0291デフォルトの名無しさん2005/05/05(木) 20:06:51
つ●【正露丸】
0292デフォルトの名無しさん2005/05/05(木) 21:24:21
>>287
>257じゃないの?
どっちにしろスレ違いなんだからそろそろ消えてね。
0293デフォルトの名無しさん2005/05/05(木) 23:29:22
bcc32 で STL って使えるの?
っつーかそんなライブラリがダウソできるの?
0294デフォルトの名無しさん2005/05/05(木) 23:31:45
( ゚д゚)…
0295デフォルトの名無しさん2005/05/05(木) 23:33:23
>>293
使える できる
0296デフォルトの名無しさん2005/05/05(木) 23:42:09
bcc も STL も知らないアホが書いてるようにしか見えない
0297デフォルトの名無しさん2005/05/05(木) 23:48:47
bcc55\Examples\StdLib
この辺見れ
0298デフォルトの名無しさん2005/05/05(木) 23:49:23
Branch if Carry Clear
0299デフォルトの名無しさん2005/05/06(金) 01:30:41
typedef struct {
unsigned char r;
unsigned char g;
unsigned char b;
} COLOR;

void Test1(const COLOR **hoge)
{
return;
}

int main(void)
{
COLOR **hoge;
int i;

hoge = malloc(sizeof(COLOR *) * NUM);
for (i = 0; i < NUM; i++) {
hoge[i] = malloc(sizeof(COLOR));
}
Test1(hoge);

return 0;
}

Test1(hoge);のところで問題のあるポインタ変換と警告が出てしまいます。
何でですか?
0300デフォルトの名無しさん2005/05/06(金) 01:31:49
void Test1(const COLOR **hoge)
ってせんげんしてるじゃん
0301デフォルトの名無しさん2005/05/06(金) 06:28:35
標準ライブラリのヘッダファイルと同名のファイルがソースファイルと同じディレクトリにあり、そのため

(#include"xxx.h"ではなく)#include<xxx.h>

としても、そのファイルを読み込んでしまいます。
標準のファイルを読み込ませる方法は無いでしょうか?
0302デフォルトの名無しさん2005/05/06(金) 07:00:13
0 == (int)'\0';
上の式は常に真ですか?
0303デフォルトの名無しさん2005/05/06(金) 07:10:33
ttp://141-189-33.biwa.ne.jp/
wwwwwwwwwwwwうはっwwwwwwwwwwww
っおkwwwwwwwwwwwwwwwwwwっ
wwwwwwwwwwwwっうはっうはっうはっうはっ
っっwwwwwwwwwwwwwwwwおkうぇwwwwww
0304デフォルトの名無しさん2005/05/06(金) 07:42:31
 
0305デフォルトの名無しさん2005/05/06(金) 08:57:16
毎度すまないけど誰か前スレの過去ログよろしこ。
0306デフォルトの名無しさん2005/05/06(金) 08:58:47
age
0307デフォルトの名無しさん2005/05/06(金) 09:34:56
>>301
インクルードパスにカレントが含まれていないなら、不等号で囲えば検索対象外になるはずだけど。
詳しくは、環境依存スレにて。
0308デフォルトの名無しさん2005/05/06(金) 09:36:00
>>302
その場合は常に真。
0xff == '\xff'は偽になることもある。
0309デフォルトの名無しさん2005/05/06(金) 10:01:31
>>302
そのキャストは完璧に意味なし
int から int に変換しているだけ
0310デフォルトの名無しさん2005/05/06(金) 10:02:18
>>301
コンパイラの環境設定でヘッダファイルの検索パスにカレントが入っているとそうなる
0311デフォルトの名無しさん2005/05/06(金) 10:11:43
>>301
君は、標準ヘッダと同名のファイルを作らない方が賢明だと思う。
03123022005/05/06(金) 11:00:02
>>308>>309
評価のときは大きい型の方にキャストされるんでしたね
ありがとん
0313デフォルトの名無しさん2005/05/06(金) 11:19:45
ちげー
0314デフォルトの名無しさん2005/05/06(金) 11:37:47
>>312
'\0'のような文字定数は元々int型。
(C++ではcharになったが)
0315デフォルトの名無しさん2005/05/06(金) 11:47:30
>>312
printf("size = %d\n", sizeof('\0'));
0316デフォルトの名無しさん2005/05/06(金) 13:07:12
>>307
>>310
>>311

thx。よく考えたらMakefileに-I.が指定されてました。
0317デフォルトの名無しさん2005/05/06(金) 14:35:51
次のプログラム例のように、メモリを動的に確保した後に余った分を部分的に
解放するというのは正しいやり方ですか、それとも反則技ですか。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
  char *pc;
  int n;

  pc = (char *)malloc(256);
  if (pc == NULL) {
    fputs("エラー\n", stderr);
    exit(-1);
  }
  gets(pc);
  n = strlen(pc) + 1;
  printf("n = %d\n", n);
  free(pc + n); /* これは正しいか、反則か */

  free(pc);
  return 0;
}
0318デフォルトの名無しさん2005/05/06(金) 14:42:50
>>317
部分開放はできないし、意味が無い
0319デフォルトの名無しさん2005/05/06(金) 14:56:48
質問です。
以下のforループで、++aの形でインクリメントしているのですが、これの意味はなんですか?
Cのテキスト(独習C)の中で今まで出てきた他のプログラムでは、forループのインクリメントは全て
a++の形で書かれていました。
色々と意味を考えてみたのですが、わかりませんでした。

/*バブルソートを使って数値を整列させる*/
for(a=1;a<count;++a){
for(b=count-1;b>=a;--b){
/*隣り合わせの要素を比較*/
if(item[b-1]>item[b]){
/*要素を交換*/
t=item[b-1];
item[b-1]=item[b];
item[b]=t;
}
}
}
0320デフォルトの名無しさん2005/05/06(金) 15:04:44
>>319
++a の意味
http://c-production.com/contents/c/sec05.html#05
0321デフォルトの名無しさん2005/05/06(金) 15:21:05
>>319
for( ; ; ※)
この位置では ++a と a++ は同じ

a++ をよく使うのはアセンブラ使いの癖
++a をよく使うのは C++ 使いの癖

>>320 のリンク先は目眩がするほど嘘ばっかり書いているから信じるな
0322デフォルトの名無しさん2005/05/06(金) 15:30:04
>>321
確かにひどい解説だ…
未定義なコード検証してるし
変なところでリテラルとか言ってるし。もとい逝ってるよ…
0323デフォルトの名無しさん2005/05/06(金) 15:50:51
ぐは、、リンクは無視するつもりだったのに
>>321がそんな事言うから見に行っちゃったじゃないかw
0324csh2005/05/06(金) 15:59:19
Cシェル勉強してるんですが。Cシェルってスクリプトなんですよね?
C言語に似た記述だから Cシェル

結局 言語を覚える感覚でよいんですか?
03253192005/05/06(金) 16:05:15
>>320-321
ありがとうございました
0326デフォルトの名無しさん2005/05/06(金) 16:10:37
>>324
それでいいけどスレ違い。
0327デフォルトの名無しさん2005/05/06(金) 16:44:41
>>320-323
ホントに酷いね。各ページに一つや二つじゃすみそうにないくらい間違いがある。
軽く指摘しようと思って問い合わせフォームを開いたらそこにもTypoがw
ttp://c-production.com/contact.html
0328デフォルトの名無しさん2005/05/06(金) 16:45:41
習い始めて三日目みたいな厨房はなにかと
説明したがるからね。
0329デフォルトの名無しさん2005/05/06(金) 17:01:12
>>321
アセンブラ使いだからこそ、a++したら--aしたくなる罠。
0330デフォルトの名無しさん2005/05/07(土) 01:58:47
アセンブラ使いは、いんくりくりではなく、ろーどあどれなりんを使うので
感覚としては「a+=1」となりまふ
03312992005/05/07(土) 01:59:43
>>300
Test1内で警告が出るのではなく、mainのTest1(hoge);のところで警告が出てしまいます。
0332デフォルトの名無しさん2005/05/07(土) 02:02:58
>>299
Test1((const COLOR **)hoge);
つーか、Cじゃなくて、C++使ってない?
殆どのCコンパイラは、そこまで煩くないと思うけど…
0333デフォルトの名無しさん2005/05/07(土) 02:03:47
>>330
増分幅はオペランドで決まるもので、即値で指定する += とはニュアンスが違う
0334デフォルトの名無しさん2005/05/07(土) 02:05:25
>>333
(?_?)?
0335デフォルトの名無しさん2005/05/07(土) 02:15:49
http://YahooBB219029188008.bbtec.net/
wwwwwwwwwwwwwうはっwwwおkwwwwwwwwwwwwwww
うぇwwwっうぇwwwwwwwww
っっうぇwwwwwwwwwwwwうはっwww
03362992005/05/07(土) 02:17:44
たぶんCです。
bcc32 test.c
gcc test.c
sc -mn -Bj -j0 test.c
でやってみたんですが、どれも似たような警告が出ます。
0337デフォルトの名無しさん2005/05/07(土) 02:21:14
>>336
めっちゃC++やん…
まぁ、ただのCは殆どないからね…
0338デフォルトの名無しさん2005/05/07(土) 02:23:49
つーか、Digital Mars使える奴が>>299の質問って、
絶対ネタとしか思えんが…
0339デフォルトの名無しさん2005/05/07(土) 02:23:52
http://p2935e7.tokynt01.ap.so-net.ne.jp/
おkwww
wうぇwwwうはっwwwっうぇおkwww
うぇwww

うはっwwwwwwwwwwwwwww
おkwwwうはっwwwwwwっ

おkwww
03402992005/05/07(土) 02:58:40
ネタではないです。
ほかのコンパイラでも警告が出るのかと思って
Digital Marsためしただけなので。

C++わからないので何で警告が出るのかまだわからないんですが
無視してもよいのですか?
Cとして?使う場合どうすればよいのですか?
0341デフォルトの名無しさん2005/05/07(土) 03:05:07
>>299
キャスト汁
03422992005/05/07(土) 03:39:49
汁?
キャスト汁って何の汁ですか?
けんちん汁の間違えですか?
もう、僕はずっと困ってるんだ。
いい加減丁寧に教えてくれよ、さもないと頃すぞ
0343デフォルトの名無しさん2005/05/07(土) 03:42:09
>>342
キエーーー! キャストーーーー!

関係ないけど、キャスターってバニラ入ってるんだね。
0344デフォルトの名無しさん2005/05/07(土) 03:46:27
>>342
ttp://www.google.co.jp/search?hl=ja&q=C%E8%A8%80%E8%AA%9E+%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88%E6%B1%81&lr=
0345デフォルトの名無しさん2005/05/07(土) 04:07:24
寝ようとしたら、思い出した
extern "C"
0346デフォルトの名無しさん2005/05/07(土) 04:32:48
>>342
C++なら
Test1(const_cast<COLOR **>(hoge));
0347デフォルトの名無しさん2005/05/07(土) 09:14:25
>>337
bcc32は拡張子でCとC++を切り替えている。
0348デフォルトの名無しさん2005/05/07(土) 18:15:37
>331

非constからconstへのキャストは暗黙のうちに行われるけど、逆は明示的なキャストが必要
0349デフォルトの名無しさん2005/05/07(土) 20:46:05
c言語の副作用って具体的にどういうことですか?
0350デフォルトの名無しさん2005/05/07(土) 21:14:07
時代に取り残されます。
0351デフォルトの名無しさん2005/05/07(土) 22:04:29
>>349
int i;

i = 4; の式で i が4になること。
インクリメント・デクリメント演算子での値の変化も副作用。
0352デフォルトの名無しさん2005/05/07(土) 22:05:29
#include <stdio.h>
#define N 3

int main(){
double a[N][N],
b[N],
temp1, temp2;
int i, j, k, l, m;

for (i=0; i<N; i++) {
for (j=0; j<N; j++) scanf("%lf", &a[i][j]);
scanf("%lf", &b[i]);
}
printf("(Input)\n");

for (i=0; i<N; i++){
for (j=0; j<N; j++) printf("%7.2f", a[i][j]);
printf(":%7.2f \n", b[i]);
}
for (i=0; i<N; i++) { printf("(i=%d)\n",i);
temp1 = a[i][i];
for (k=0; k<N; k++)
a[i][k] = a[i][k]/temp1;
b[i] = b[i]/temp1;

for(l=0; l<N; l++)
printf("%7.2f",a[i][l]);
printf(":%7.2f\n",b[i]);
0353デフォルトの名無しさん2005/05/07(土) 22:06:18
(続き)


for (j=0; j<N; j++)
if (i != j){
temp2 = a[j][i];
for (k=0; k<N; k++) a[j][k] -=temp2*a[i][k];
b[j] -= temp2*b[i];
for (m=0; m<N; m++)
printf("%7.2f", a[j][m]);
printf(":%7.2f\n", b[j]);
}
}
for (i=0; i<N; i++) printf("%10.2f", b[i]);
printf("\n");
}

すいません、コレにピボット交換の機能をつけて貰えませんか?
0354デフォルトの名無しさん2005/05/07(土) 22:08:46
コメントくらい書け。
0355デフォルトの名無しさん2005/05/07(土) 22:16:21
>>352
>>1
> ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
0356デフォルトの名無しさん2005/05/07(土) 22:16:41
ttp://i218-47-78-119.s01.a014.ap.plala.or.jp/
おkうはっおkwwwwうぇwwwおkwwwうはっっ
wうはっおkっっうぇっうはっおkっwおkwwwwwwwwwwww
wwwwwwwwwwwwおkwwwwwwwwwwww
っうはっおkっおkwwっっw
うはっ
03573492005/05/07(土) 22:22:03
>>351
分かりやすかったです、ありがとです。
03582992005/05/08(日) 01:13:08
何でC++がでてくるんですか?
test.cはC++のソースとしてコンパイルされているということですか?

Test1((const COLOR **) hoge);とすれば警告は消えるんですが
何でキャストが必要なのか、何でキャストしないと警告が出るのか、わかりません。

そういえば
void Test1(const COLOR **hoge);
COLOR **hoge;
hoge = malloc(sizeof(COLOR *) * NUM);
for (i = 0; i < NUM; i++)
hoge[i] = malloc(sizeof(COLOR));
Test1(hoge);
と
void Test1(const COLOR *hoge);
COLOR *hoge;
hoge = malloc(sizeof(COLOR) * NUM);
Test1(hoge);
は使い分けたほうがいいんですか?
後者のほうだと警告もエラーも出ないです。
0359デフォルトの名無しさん2005/05/08(日) 01:32:52
>>358
const の意味はわかってる?
うっかりを防止するための警告なんだがね。
0360デフォルトの名無しさん2005/05/08(日) 01:49:48
>>299
あのね。
const COLOR** と COLOR** は全く違う型なの。
どっち向きにもキャストなしに代入できません。

const COLOR* と COLOR* なら右から左へ自動的に変換されます。
COLOR*const* と COLOR** でも自動的に変換されます。

基本的にポインタの暗黙の変換は同じ型であることが前提
ただし、ポインタを“1つだけ”はがした型に constが付いている場合は
ついてる方向への変換は可能。

2つ以上はがした型に constが付いていた場合、それは全く別の型と見なされ、キャストなしには代入できません。
03612992005/05/08(日) 03:01:01
>>360
難しくて理解できてないですが
なんとなくわかりました。
ありがとうございました。
0362デフォルトの名無しさん2005/05/08(日) 04:56:21
#include <stdio.h>
#include <math.h>
#define N 3

int main(){
double a[N][N],
b[N],
    b1,
x[1][N],
s, temp1, temp2;
int i, j, k, l, m, t, pivot;



for (i=0; i<N; i++) { /*    入力読み取り */
   for (j=0; j<N; j++) scanf("%lf", &a[i][j]);
  scanf("%lf", &b[i]);
   }
                /*  読み取りデータ出力  */
printf("(Input)\n");

   for (i=0; i<N; i++){
  for (j=0; j<N; j++) printf("%7.2f", a[i][j]);
   printf(":%7.2f \n", b[i]); 
   }

for (i=0; i<N; i++) { printf("(i=%d)\n",i);

0363デフォルトの名無しさん2005/05/08(日) 04:57:06
/* ピボット選択・交換開始 */
s=0; pivot=i;
for(t=i;t<N;t++) {
if(fabs(a[t][i])>s) { //i列の中で一番値が大きい行を選ぶ
s=fabs(a[t][i]);
pivot=t; printf("%lf\n",s);
}
}
if(pivot !=i) { //pivotがiと違えば、行の入れ替え
for(j=0;j<N;j++) {
x[0][j]=a[i][j];
a[i][j]=a[pivot][j];
a[pivot][j]=x[0][j];
} b1=b[i]; b[i]=b[pivot]; b[pivot]=b1;
}
for (l=0; l<N; l++){    /* 交換した係数行列を表示  */
for (m=0; m<N; j++) printf("%7.2f", a[l][m]);
printf(":%7.2f \n", b[l]);}


temp1 = a[i][i]; /*    通常通り計算 */
for (k=0; k<N; k++)
a[i][k] = a[i][k]/temp1;
b[i] = b[i]/temp1;


0364デフォルトの名無しさん2005/05/08(日) 05:00:03
for(l=0; l<N; l++)
printf("%7.2f",a[i][l]);
printf(":%7.2f\n",b[i]);

for (j=0; j<N; j++)
if (i != j){
temp2 = a[j][i];
for (k=0; k<N; k++) a[j][k] -=temp2*a[i][k];
b[j] -= temp2*b[i];
for (m=0; m<N; m++)
printf("%7.2f", a[j][m]);
printf(":%7.2f\n", b[j]);
}
}
for (i=0; i<N; i++) printf("%10.2f", b[i]);

printf("\n");
}


>>362-364
コンパイルしようとすると文字が識別できずにエラーとなってしまうのですが、どこが間違っているのでしょうか?
助けてください!
環境はwinXPでコンパイラ(バージョン):Microsoft.NET FrameworkSDK です
0365デフォルトの名無しさん2005/05/08(日) 05:23:37
んだよテメー回答者に霊も言わずにあっちこっち質問してんじゃねーよ
03663602005/05/08(日) 05:30:37
> 基本的にポインタの暗黙の変換は同じ型であることが前提

何 を 言 っ て る ん だ ? 俺 は。

要するに
代入は、同じ型じゃなきゃ基本的にはだめ。
但し、型が違っても、代入先の被参照型に余分に修飾子が付いている、
というだけの違いなら大丈夫。
0367デフォルトの名無しさん2005/05/08(日) 06:23:03
>>362-364
うんこ氏ね
0368デフォルトの名無しさん2005/05/08(日) 06:59:54
質問です。
XPでBorland C++を使ってCの勉強してます。
現在文字列のあたりを勉強しているのですが、
gets()で日本語の文字列を入力しようと思っても、入力できません。
全角キーを押しても、半角しか入力できないんです。
どのようにすればいいか教えてください。
0369デフォルトの名無しさん2005/05/08(日) 07:12:32
コピペする
0370デフォルトの名無しさん2005/05/08(日) 07:23:50
ヒント:Alt + 全角
03713682005/05/08(日) 09:23:27
>>3370
できました。
ありがとうございます。
0372371=3682005/05/08(日) 09:24:24
すいません
>>370のまちがいでした
0373デフォルトの名無しさん2005/05/08(日) 12:06:25
質問です。
文字列を入力した順の逆から表示するプログラムを作成しているのですが、
以下のやり方では文末が文字化けしてしまいました。
何がまずかったのでしょうか?
(解答ではforループ内で、1charづつ出力してました。
自分でも動作確認したところ、そちらの方はきちんと動きました。)

#include "stdio.h"
#include "string.h"

main()
{
char str[100],str2[100];
int i,l;

printf("文字列を入力せよ: ");
gets(str);

l=strlen(str);

for(i=l-1;i>=0;i--){
str2[l-1-i]=str[i];
}

printf("%s\n",str2);
}
0374デフォルトの名無しさん2005/05/08(日) 12:09:50
>>373
この関数を使え。

void swap (char* a, char* b) {char tmp = *a; *a = *b; *b = tmp;}
char* reverse (char* str) {
char *p, *ep;
p = ep = str;
while (*ep++); ep -= 2;
while (p < ep) {swap (p, ep); p++; ep--;}
return str;
}
void print_freq (const char* str) {

}
int main () {
char str[] = "abcdef";
printf ("%s\n", reverse (str));
return 0;
}
0375デフォルトの名無しさん2005/05/08(日) 12:45:25
#include <stdio.h>
#include <string.h>

void swap(char* lhs, char* rhs)
{
    char oldLhs = *lhs;
    *lhs = *rhs;
    *rhs = oldLhs;
}

void reverseRange(char* first, char* last)
{
    for (; first < last; ++first) {
        swap(first, --last);
    }
}

void reverse(char* string)
{ reverseRange(string, string + strlen(string)); }

int main(void)
{
    char s[] = "The quick brown fox jumpx over the lazy dog.";

    printf("%s\n", s);
    reverse(s);
    printf("%s\n", s);

    return 0;
}

漏れの脳内コンパイルは通った
0376デフォルトの名無しさん2005/05/08(日) 12:48:57
>>375
> strlen(string)
これ無駄過ぎ。なんで繰り返しを2回もやるのかと。
0377デフォルトの名無しさん2005/05/08(日) 12:52:08
>>376
意味不明
0378デフォルトの名無しさん2005/05/08(日) 12:53:38
for 文がヘボい
0379デフォルトの名無しさん2005/05/08(日) 12:53:54
>>377
strlenの中身は先頭から\0がくるまで文字数をカウント。
繰り返しだ。
0380デフォルトの名無しさん2005/05/08(日) 12:59:03
>>379
じゃあどうするの??
0381デフォルトの名無しさん2005/05/08(日) 12:59:45
>>380
>>374
0382デフォルトの名無しさん2005/05/08(日) 13:00:11
#include<stdio.h>

int get_power(int x, int n);
int main(void);

/* x の n乗の計算 */
int get_power(int x, int n)
{
int i,y = 1;

for(i = 0;i < n;i++){
y = y * x;
}
return(y);
}

int main(void)
{
printf("%d\n",get_power(8, 2)):
return(0);
}
xのn乗の計算をするわけですが、なぜここでfor文がつかわれるのかわかりません。
初歩的な質問ですみませんm(__)m
0383デフォルトの名無しさん2005/05/08(日) 13:01:13
>>381
やってることは同じだろw
0384デフォルトの名無しさん2005/05/08(日) 13:01:51
>>381
計算量的に同じだと思うが…
0385デフォルトの名無しさん2005/05/08(日) 13:02:43
>>378
じゃあどう書けば美しいんだ?
0386デフォルトの名無しさん2005/05/08(日) 13:04:27
>>382
int power (int x, int y) {
if (y == 0) return 1;
else if (y == 1) return x;
else return x * power (x, y-1);
}
だったら再帰使えよ。
0387デフォルトの名無しさん2005/05/08(日) 13:05:12
>>374のコードって長さ0の文字が与えられたら
未定義の動作になるんじゃないの?
0388デフォルトの名無しさん2005/05/08(日) 13:08:20
>>387
無問題
0389デフォルトの名無しさん2005/05/08(日) 13:13:00
>>374=>>376=>>378=>>379=>>381=>>388だな
0390デフォルトの名無しさん2005/05/08(日) 13:14:41
>>388
無問題なわけねーだろww
って釣りか?
0391デフォルトの名無しさん2005/05/08(日) 13:20:47
>>389
なに今さらまとめちゃってんの?
0392デフォルトの名無しさん2005/05/08(日) 13:26:20
>>374は近年稀に見る低脳だな
0393デフォルトの名無しさん2005/05/08(日) 13:30:22
>>392
うるさい 低能っていうやつが低能なんだよ!!!!!!!!!
0394デフォルトの名無しさん2005/05/08(日) 13:34:46
>>385
++ のタイミングあたり
間違っちゃいないけどダサい

例えるなら sprintf 一発で済むことを strcat で延々書いているようなスタイルだ
0395デフォルトの名無しさん2005/05/08(日) 13:36:26
>>386
再帰の使い方のうち最悪な例の1つだな
0396デフォルトの名無しさん2005/05/08(日) 13:36:55
>>394
じゃあどうすれば sprintf 一発で済む感じになるの?
見本キボンヌ
0397デフォルトの名無しさん2005/05/08(日) 13:37:36
>>396
ここから有料です
0398デフォルトの名無しさん2005/05/08(日) 13:39:56
>>394
必死すぎwwwww

>>395
まあ、再帰を使うべき場面ってあんまないしね…
0399デフォルトの名無しさん2005/05/08(日) 13:41:35
http://YahooBB221097002236.bbtec.net/
うぇwwwっwwwwwwwwwwwwwwwwwうはっwww
おkwwwwwwwwwwwwwwwっw

っwwwwwwwwwwwwおkwwwっw
wwwwwwwwwwww
0400デフォルトの名無しさん2005/05/08(日) 13:43:50
>>398
再帰使いたいならCやめて関数型言語使えよ。
0401デフォルトの名無しさん2005/05/08(日) 13:45:23
>>398
再帰のほうがきれいに書けるときは使う
使ってはならない条件に該当したとき無理して非再帰にばらす
0402デフォルトの名無しさん2005/05/08(日) 13:47:18
多くの場合で再帰の方が美しく書けるものだが…
効率を考えると関数のオーバヘッドは無視できないから、汚くてもforやらwhileを使う。
0403デフォルトの名無しさん2005/05/08(日) 13:57:50
[begin, last) なアルゴリズムで書くときって誰が書いても
>>375のようになるよね。STLとかはこういうforの使い方ばっかり。
for( ; begin != end; ++begin ) とか、for( ; last != begin; ){ --last; ... } とか

>>401
クイックソートとか木とかはいい例ですよね。
あれくらい楽になれば漏れも再帰使う。
でもn乗を求める場合は再帰使う利点って何一つとしてないような…?
0404デフォルトの名無しさん2005/05/08(日) 14:04:39
int power(int x, int y) {
int r=1;
if(y) {
r=power(x, y>>1);
r*=r;
if(y&1) r*=x;
}
return r;
}
0405デフォルトの名無しさん2005/05/08(日) 14:06:24
あー、>>404だとlogNのオーダーになるのかな?
これだと再帰使う利点がかなりあると思う
0406デフォルトの名無しさん2005/05/08(日) 14:15:52
>>403
お、STL が出てきたぞw
0407デフォルトの名無しさん2005/05/08(日) 15:21:27
>>403
ソートでの再帰は最大エレメント数が予めわかっているときにだけ使う場合があるが原則禁止
ツリーも同様、あれはちょっと工夫すればすぐ非再帰にできる
0408デフォルトの名無しさん2005/05/08(日) 15:26:15
全て再帰で表現できるからforもwhileも要らない。よってforもwhileも使うな。最適化できないコンパイラが悪い。
0409デフォルトの名無しさん2005/05/08(日) 15:27:12
>>407
厳しすぎね?
0410デフォルトの名無しさん2005/05/08(日) 15:33:01
>>407
ハノイの塔を再帰使わずに書いてみろ。
0411デフォルトの名無しさん2005/05/08(日) 15:37:18
>>410
死ぬほど簡単なアルゴリズムがあるが、何か?
0412デフォルトの名無しさん2005/05/08(日) 15:38:23
BASICでも書けるからなぁ・・・
0413デフォルトの名無しさん2005/05/08(日) 15:47:02
整数論的な解法を使わなかった場合は?
0414デフォルトの名無しさん2005/05/08(日) 15:53:21
>>413
そんときは再帰で根性だろうけど。
例が悪すぎたな。
0415デフォルトの名無しさん2005/05/08(日) 16:28:39
>407
速度等の都合でどうしてもやらざるをえない場合を除いて原則、再帰使用だ
"ちょっと工夫"ができない香具師があまりにも多すぎる
0416デフォルトの名無しさん2005/05/08(日) 16:57:15
へたくそでも再帰に使おうとすると関数がきれいになる

そうでもないか・・・
0417デフォルトの名無しさん2005/05/08(日) 17:14:50
むはははは
-eオプションでエスケープを解釈するechoコマンドを作ったぞ!
0418デフォルトの名無しさん2005/05/08(日) 17:16:06
ダイテル本(C言語のほう)「ランダムアクセスファイルにランダムにデータを書き込む」のとこで
行き詰まってます。環境はwindows + VC6。何が間違ってるのかよくわからず・・
だいたいメモリエラーになります。

#include <stdio.h>

struct clientData{
  int acctNum;
  char lastName[15];
  char firstName[10];
  float balance;
};

main()
{
  FILE *cfptr;
  struct clientData client;

  if((cfptr = fopen("credit.dat","r+")) == NULL)
    printf("ファイルをオープンできません\n");

0419デフォルトの名無しさん2005/05/08(日) 17:16:34
  else{
   printf("顧客の口座番号(1-100)を入力してください(0を入力すると終了)\n?");
   scanf("%d", &client.acctNum);

   while(client.acctNum != 0){
     printf("名字、名前、取引残高を入力してください\n?");
     scanf("%s%s%f",client.lastName, client.firstName, client.balance);

     fseek(cfptr, (client.acctNum - 1) * sizeof(struct clientData), SEEK_SET);
     fwrite(&client, sizeof(struct clientData), 1, cfptr);
     printf("口座番号を入力してください\n?");
     scanf("%d",&client.acctNum);
   }
  }

 fclose(cfptr);
 return (0);
}
0420デフォルトの名無しさん2005/05/08(日) 17:23:01
scanfの使い方わかってんのと小一時間(ry
04214182005/05/08(日) 17:25:32
ま、あの、ソースは原文まんまなんでなんとも・・
0422デフォルトの名無しさん2005/05/08(日) 17:29:46
>scanf("%s%s%f",client.lastName, client.firstName, client.balance);
0423デフォルトの名無しさん2005/05/08(日) 17:46:00
fclose(NULL)って拙くないかい?
04244182005/05/08(日) 17:46:01
以下のようにバラしてみましたが・・どうも解決せず・・・
別のとこにも問題アリでしょうか・・
scanfで"%f"を取るのは大丈夫ですよね??

printf("名字、名前、取引残高を入力してください\n?");
printf("名字:");
fgets(client.lastName, sizeof(client.lastName), stdin);
printf("名前:");
fgets(client.firstName, sizeof(client.firstName), stdin);
printf("取引残高:");
scanf("%f",client.balance);
0425デフォルトの名無しさん2005/05/08(日) 17:46:33
>>424
>scanf("%f",client.balance);
0426デフォルトの名無しさん2005/05/08(日) 17:58:44
>421
本の誤りを指摘すると、お礼として図書券とかもらえる事があるらしい
急げ
04274182005/05/08(日) 17:58:58
fgets(line, sizeof(line), stdin); /*文字用の配列lineをとりました*/
sscanf(line,"%f",&client.balance);

む、むむむ、なんか動作変わってきました!確認してみます!!
0428デフォルトの名無しさん2005/05/08(日) 18:00:04
>なんか動作変わって

scanf変えとるやんw
04294182005/05/08(日) 18:10:45
拙い状態ではありますが、以下のようにしました

while(client.acctNum != 0){
  printf("名字、名前、取引残高を入力してください\n");

  printf("名字:");
  fgets(client.lastName, sizeof(client.lastName), stdin);

  printf("名前:");
  fgets(client.firstName, sizeof(client.firstName), stdin);

  printf("取引残高:");
  fgets(line, sizeof(line), stdin); /*文字用の配列lineをとりました*/
  sscanf(line,"%f",&client.balance);

  fseek(cfptr, (client.acctNum - 1) * sizeof(struct clientData), SEEK_SET);
  fwrite(&client, sizeof(struct clientData), 1, cfptr);
  printf("口座番号を入力してください\n?");
  fgets(line, sizeof(line), stdin); /*文字用の配列lineを使ってます*/
  sscanf(line,"%d", &client.acctNum);
}
04304182005/05/08(日) 18:13:00
動きました!!
なんか2週間くらい詰まってたので無茶苦茶嬉しいです!
0431デフォルトの名無しさん2005/05/08(日) 18:14:32
だからさ
>scanf("%f",client.balance);
と
>sscanf(line,"%f",&client.balance);
の決定的な違いに気が付いてんの?
 scanf(  "%f", client.balance);
sscanf(...,"%f",&client.balance);
わかんね?

04324182005/05/08(日) 18:14:33
ありがとうございます!
あと、fcloseのとこの処理ですね。これも気をつけます!
0433デフォルトの名無しさん2005/05/08(日) 18:15:53
>fclose

...もまえオモシロスギ
0434デフォルトの名無しさん2005/05/08(日) 18:16:26
>>418
どーでもいいけど気持ち悪いコードだな
K&Rスタイルで書いてるのかと思いきや
int 返しやポインタ返しの関数にわざわざ #include 使ったり
条件に != 0 とか出てきたり・・・
04354182005/05/08(日) 18:16:43
>>431
もしかして・・・'&'ですか???
0436デフォルトの名無しさん2005/05/08(日) 18:19:11
単位が0.25m/sの数値ををkm/hに直したいんですが、、
1.11をかければkm/hになりますよね。
1.11だとfloat使わなきゃいけないんで、floatを使わずに変換する方法ありますか?
0437デフォルトの名無しさん2005/05/08(日) 18:22:29
>>436
4 倍すれば [m/s] 単位
3600 倍すれば [m/h] 単位
60 で割れば [km/h] 単位

おい、文部科学省! 小学校で一体何を教えているんだ?
0438デフォルトの名無しさん2005/05/08(日) 18:23:19
s/4 倍すれば/4 で割れば/
0439デフォルトの名無しさん2005/05/08(日) 18:24:07
fclose(NULL)しても平気
(処理系依存?)
0440デフォルトの名無しさん2005/05/08(日) 18:24:33
s/60/・・・・あかん脳がラリってる
0441デフォルトの名無しさん2005/05/08(日) 18:25:26
>>439
http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3010
0442デフォルトの名無しさん2005/05/08(日) 18:28:54
「猫でもできるwindowsプログラミング」という本に付属されているサンプルコードをコンパイルしようとしたのですがうまくできません。
どこがまずいのでしょうか?(C言語プログラムと書かれて言うのに拡張子がcppですもしかしてC++?)
windows.hがないのかな・・・

■実行コマンド

>cl sample01.cpp


■出力結果

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.40607.16 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

sample01.cpp
sample01.cpp(3) : fatal error C1083: Cannot open include file: 'windows.h': No such file or directory
0443デフォルトの名無しさん2005/05/08(日) 18:32:11
>437
まてまてもちつけ順番に

Km = 1000m

m = 60s
h = 60m = 3600s

Km/h = 1000m / 3600s
 = [1000 / 3600] m/s

つまり m/s を 1000倍して 3600で割れば Km/h
0444デフォルトの名無しさん2005/05/08(日) 18:32:16
>>442
windows.hがないね。
インクルードパス上にwindows.hを置けばいいと思うよ。
0445デフォルトの名無しさん2005/05/08(日) 18:34:23
>>444
またそういう破壊的なジョークを・・・
0446デフォルトの名無しさん2005/05/08(日) 18:34:57
>>444
ごめんなさい・・・インクルードパス上にwindows.hを置くとはどういう意味ですか?
具体的にはどうすればよいのかわかりません・・・本当ごめんなさい。
0447デフォルトの名無しさん2005/05/08(日) 18:38:42
>>442
コマンドプロンプトの起動の仕方が間違っていると思われ
[スタート] - [すべてのプログラム] - [Microsoft Visual Studio 2005 Beta] - [Visual Studio Tools] - [Visual Studio Command Prompt]
で起動したコマンドプロンプトからやってみれ
0448デフォルトの名無しさん2005/05/08(日) 18:39:34
>>443
ん、任せた
0449デフォルトの名無しさん2005/05/08(日) 18:40:37
>>447
それでやってるんですけど・・・・少し書き換えたのがまずかったのかな・・・
オリジナルも残しているのでデフォルトに戻して試してみます。
0450デフォルトの名無しさん2005/05/08(日) 18:43:02
>>449
"C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat"
↑
これ実行してもダメか?
0451デフォルトの名無しさん2005/05/08(日) 18:46:35
>>450
はい。できません(汗



0452デフォルトの名無しさん2005/05/08(日) 18:48:59
実行ってコマンドプロンプトからだぞ、ダブルクリックじゃなく
0453デフォルトの名無しさん2005/05/08(日) 18:50:00
>>451
できません じゃねーよぼけ
どうできないのか具体的に書けや

コマンドを実行してどうなった?
コマンド自体がエラーになったのか?
エラーならそのメッセージは?
それとも正常に終わったのか?

てめーみたいな低脳はなぁ、一歩一歩を大切にしないと
一生成長できないんだ。わかったか?
0454デフォルトの名無しさん2005/05/08(日) 18:49:59
>>452
はい。そのままダブルクリックしたらコマンドプロンプトは終了しちゃうので・・・
0455デフォルトの名無しさん2005/05/08(日) 18:51:15
「少し書き換えたのがまずかった」が正解みたいだな
再インスコしる
0456デフォルトの名無しさん2005/05/08(日) 18:51:31
>>453
>>442を参照してください。

バッチで環境変数をSETしているのは知ってますが、そもそもそれがまちがってるのかな?
0457デフォルトの名無しさん2005/05/08(日) 18:52:17
start とか使ってねえだろな
0458デフォルトの名無しさん2005/05/08(日) 18:52:55
%comspec% とか使ってねえだろな
0459デフォルトの名無しさん2005/05/08(日) 18:53:41
>>445
ごめんなさい。書き換えたのではなく書き加えました。表現が間違ってすみません。
書き加えたのはディレクトリの移動だけです・・・もしかしてコンパイルするのは所定の場所でないといけないのかな?
0460デフォルトの名無しさん2005/05/08(日) 18:54:35
%comspec% /k ""C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.bat""

↑これで起動してます。もしかしてこれがまずいのでしょうか?
0461デフォルトの名無しさん2005/05/08(日) 18:56:46
まずい

cl実行するコマンドプロンプトでvsvars32.batを動かせ
0462デフォルトの名無しさん2005/05/08(日) 18:58:58
あー、そっか
SDK 入れてないだろ?

set | find "INCLUDE"
で表示されるディレクトリに windows.h があるかどうか見てみ
0463デフォルトの名無しさん2005/05/08(日) 18:59:35
>>461
/k ならいいんじゃないか
/c はまずいけど
0464デフォルトの名無しさん2005/05/08(日) 19:00:11
�@コマンドプロンプトを起動
�A「C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.bat」をプロンプト上で実行
�Bカレントディレクトリの移動(D:ドライブに行ってます)
�C「cl sample01.cpp」をプロンプトで実行(拡張子がcの場合も試しました)
�D>>442が出力されました・・・


ベータ版だからできないのかな・・・windows.hをインクルードしない簡単なプログラムはコンパイルできたのですか・・・
0465デフォルトの名無しさん2005/05/08(日) 19:00:46
/C command 指定したコマンドの実行後に復帰する
/K command 指定したコマンドを実行する(復帰はEXITコマンドで)
04664422005/05/08(日) 19:06:59
�@下記を実行
  ■実行コマンド
  set | find "INCLUDE"

  ■出力結果
  INCLUDE=C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE;


�A出力フォルダ内にwindows.hの有無を確認

  無

  ・・・・・え〜〜windows.hというのが存在しませんでした(汗
0467デフォルトの名無しさん2005/05/08(日) 19:13:28
>>443
単位0.25m/sなら
250倍して3600で割ればいいわけですね。
0468デフォルトの名無しさん2005/05/08(日) 19:15:52
>250倍して
0.25*1000という意味?
0469デフォルトの名無しさん2005/05/08(日) 19:36:48
>>466
Windowsプログラミングなのに windows.h が無いとか洒落にしかならんな。。。

ところで、Windows.h と windows.h

どっちが正しいんだ?
0470デフォルトの名無しさん2005/05/08(日) 19:38:06
windowsでは
どちらも同じ
0471デフォルトの名無しさん2005/05/08(日) 19:38:38
>>469

それ、OS の仕様を知らなさすぎ
頭悪スレがお似合い (プ
0472デフォルトの名無しさん2005/05/08(日) 19:39:38
目糞鼻糞
0473デフォルトの名無しさん2005/05/08(日) 19:40:59
ふと思ったんだが、UNIX 系で動作する Windows 用のクロスコンパイラって今でもあるのか?
0474デフォルトの名無しさん2005/05/08(日) 19:44:14
http://JJ079055.ppp.dion.ne.jp/
うぇwwwwwwwwwwっうぇwwwwwwwwwwww
っうぇ
wwwwwwうぇwwwうぇwwwwwwwww
wwwwwwwwwwwwwwwおkwww
0475デフォルトの名無しさん2005/05/08(日) 20:03:19
参考書などの
「関数の引数に配列全体を渡すことはできない」
というのが、イマイチ理解できません。

#include<stdio.h>

void kansu(char ptr[])
{
printf("%s",ptr);
}

int main(void)
{
char str[5]="1234";

kansu(str);

return(0);
}

というのを実行しても問題なく「1234」と表示されますし、
仮引数に配列全体渡されてるじゃん、と思ってしまうのです。
どうかご教授お願いします。
0476デフォルトの名無しさん2005/05/08(日) 20:09:10
char str[5+5]="1234\09876";

ってやって
関数で配列strの大きさをどうやって汁?

ちなみに main() でなら sizeof(str)/sizeof(str[0]) でわかるが
0477デフォルトの名無しさん2005/05/08(日) 20:26:10
>>476
渡されているのは、先頭の要素のアドレスだけ。
呼び出された関数は、そこから配列が始まるものとして動作する。
04784762005/05/08(日) 20:28:08
>477

もれあて?
何がいいたいの?
0479デフォルトの名無しさん2005/05/08(日) 20:37:07
gccなどでアセンブリを吐かせてみると分かると思うが(言語仕様を調べる方が早い?)、
関数には配列の先頭を指すポインタを渡している。
配列そのものを渡しているわけではない。
0480デフォルトの名無しさん2005/05/08(日) 20:46:45
つーか、サイズ書いても無視される時点で気付け
0481デフォルトの名無しさん2005/05/08(日) 20:51:41
>>476
なあ、コードに「俺はヴァカ」って書いてあるぞ?
0482デフォルトの名無しさん2005/05/08(日) 20:53:12
>>475
> というのを実行しても問題なく「1234」と表示されますし、
これは、char型配列の最後に0という値が入っていて、文字列を扱うライブラリ関数(この場合はprintf)は、
kansuに渡した先頭ポインタptrから順にたどって、0という値を見付けると停止するようにできているの。
04834752005/05/08(日) 20:54:17
なんとなく分かったかも。
先頭要素だけを渡してるから↓でもOKなのかな。
一見、全体を渡してるように見えても実際は先頭だけってこと?

#include<stdio.h>

void kansu(char ptr[1])
{
printf("%s",ptr);
}

int main(void)
{
char str[10]="123456789";

kansu(str);

return(0);
}
0484デフォルトの名無しさん2005/05/08(日) 20:55:28
>void kansu(char ptr[1])

意味ない書き方
(そもそもコンパイル通る?)
0485デフォルトの名無しさん2005/05/08(日) 20:57:41
>>483
> 一見、全体を渡してるように見えても
見えてない見えてない
例えば、str[1]は、*(str+1)とも書けるんだ。これだとポインタを意識しやすいでしょ。
0486デフォルトの名無しさん2005/05/08(日) 20:58:51
>>483
> void kansu(char ptr[1])
あ、これはおかしいな。
ptr[1]とは*(ptr+1)
要素を指していることになる。おかしい。
0487デフォルトの名無しさん2005/05/08(日) 21:02:08
ここでチェックしておきたいことは、
kansuの定義を kansu(char* ptr)としてみるとか
kansu(&str[1])で呼び出してみるとかじゃないの?
04884182005/05/08(日) 21:11:10
今更>>418ですが、>>429の状態でも
元の状態からscanfの&を直した状態でも動いたり動かなかったり
(コンパイルは通る)
なんか別の個所がおかしいのかも・・
0489デフォルトの名無しさん2005/05/08(日) 21:12:33
kansu(str);
では「先頭アドレス」を渡しているだけ。
0490デフォルトの名無しさん2005/05/08(日) 21:18:25
kansu(&str);
0491デフォルトの名無しさん2005/05/08(日) 21:33:14
>>469
そうです。違いますかね?
0492デフォルトの名無しさん2005/05/08(日) 21:37:35
C言語を勉強して何に役立つかわかりません。visualC++.net2003をインストールしているが使い方がわかりません。本を読むとMSDOS上でコンパイルして結果が表示されるようです。C言語でできることを教えてください。
0493デフォルトの名無しさん2005/05/08(日) 21:41:23
sample.c(15) : error C2018: 文字 '0x81' は認識できません。Unicode 識別子はサポー
トされていません。


こういう表示がされた場合って、基本的に何が原因なんでしょうか
0494デフォルトの名無しさん2005/05/08(日) 21:44:23
漢字文字が含まれている>493
0495デフォルトの名無しさん2005/05/08(日) 21:45:23
>C言語でできること

ありとあらゆること
0496デフォルトの名無しさん2005/05/08(日) 21:51:30
>>493
全角使うなアフォ
0497デフォルトの名無しさん2005/05/08(日) 21:54:21
>printf("取引残高:");
>fgets(line, sizeof(line), stdin); /*文字用の配列lineをとりました*/
>sscanf(line,"%f",&client.balance);

>>488
なんで残高にfloat使ってんの?
unsigned long int か long long int つかったほうがいいと思うが、
floatだとライン入力時に小数点を打たない場合エラーでなかったけか?
0498デフォルトの名無しさん2005/05/08(日) 21:55:26
>floatだとライン入力時に小数点を打たない場合エラーでなかったけか?
でない
04994182005/05/08(日) 22:06:58
一応小数点は打ってます。実行時に
Debug Error! と、あまり見慣れない
エラーダイアログが出て終了してしまう場合と
なんなく実行できる場合があります。
0500デフォルトの名無しさん2005/05/08(日) 22:08:49
>>495
うそだねー
多重仮想記憶の OS 書けねえ
0501デフォルトの名無しさん2005/05/08(日) 22:12:17
>>500
それなんてエロゲー?
05024182005/05/08(日) 22:14:53
エラーダイアログはこんな感じです。
_______________________________________
×Debug Error!
Program:D:\C\test\Debug\test.exe
runtime error
(Press Retry to debug the application)

 [中止(A)] [再試行(R)] [無視(I)]
_______________________________________
0503デフォルトの名無しさん2005/05/08(日) 22:14:59
侮辱系の。
0504デフォルトの名無しさん2005/05/08(日) 22:17:33
>>502
侮辱系のエロゲーか・・・
0505デフォルトの名無しさん2005/05/08(日) 22:18:09
fseek で失敗しているのに 処理続行してないか? > 499
05064182005/05/08(日) 22:22:50
>>505
fseekの失敗はチェックしてませんでした。
確認してみます
05074182005/05/08(日) 22:46:28
エラーチェック入れてみました。
if(fseek(cfptr, ((client.acctNum - 1) * sizeof(struct clientData)), SEEK_SET))
  fprintf(stderr,"fseek に失敗してます\n");

どうも変わっていない様子。気長にデバッグしてみまっす。
0508デフォルトの名無しさん2005/05/08(日) 22:49:12
>気長にデバッグ

単純にファイルの終わりを超えてseekしてんじゃねの? とおもたが
0509デフォルトの名無しさん2005/05/08(日) 22:51:58
>>508
それは fseek では検出でけへん
0510デフォルトの名無しさん2005/05/08(日) 22:53:43
>509
失敗しないの?
0511デフォルトの名無しさん2005/05/08(日) 23:24:00
失敗しない
0512デフォルトの名無しさん2005/05/08(日) 23:28:56
うそ
0513デフォルトの名無しさん2005/05/08(日) 23:31:03
ほんと
05144182005/05/09(月) 00:22:17
ダイテル本の欠点として挙がってるバイナリファイルとテキストファイルが
ごっちゃになってる点は直してみました。

読み込まれる"credit.dat"は"wb"オプションで作成して、今回うまくいってない
「ランダムアクセスファイルにランダムにデータを書き込む」
の際には"credit.dat"を"rb+"オプションで開くように直しました。

・・んがっ・・状況変わらず。
気長にいきまっす。。
0515デフォルトの名無しさん2005/05/09(月) 01:16:57
なんか数学っぽい問題なんですけど、初心者なんで誰か教えてください…

�@整数nを入力して、1以上n以下の完全数を全て求めるプログラムを作成せよ。
�A二分法(中間値の定理の応用)を利用して、方程式sinx=0の解の1つであるπの近似値を求めてみよ。

って問題です。
まだ制御文(while,for)を習ったところなので、その程度の知識で出来るらしいのですが、
むしろ数学的なものがわからないんです。。。
0516デフォルトの名無しさん2005/05/09(月) 01:18:15
バイナリ?テキスト?欠点?ごっちゃだと???
馬鹿かお前は。無知にもほどがある。
0517デフォルトの名無しさん2005/05/09(月) 01:18:55
>>515
>1をよめ。
0518デフォルトの名無しさん2005/05/09(月) 01:26:49
サイズがchaのrData[40]という配列の要素に対して、
Data[10]には符号なし、Data[11]に対しては符号つきでアクセスしたいといった場合、
型変換をする方法だと、その型の範囲外のサイズのものに対しては、
変換された値が保証されなくなってしまいます。
どうしたらよいのでしょうか?

いちおうこんな方法も考えてみたのですが・・・
typedef union
  char c;
  unsigned char uc;
} DATA;

DATA  Data[40];

Data[10].uc=200;
Data[11].c=-10:

のようにしてアクセスするのは、どう思いますか?
0519デフォルトの名無しさん2005/05/09(月) 01:32:48
>>515 数学板行こう

だが板違いにも教えてあげると、完全数っていうのは、自身を除く約数を全部足したら自身に戻る数
例えば6!6の約数は1,2,3で、全部足したら6に戻る(’−’)b

二分法っていうのは、f(a) < 0 < f(b)となるa, bを選べば、f(x)=0の解は区間(a, b)に含まれる。
そこで中間値c = (a + b)/2を取って、もしf(c) > 0なら解は区間(a, c)に狭まる。
それで近似解を求めること(’−’)b
0520デフォルトの名無しさん2005/05/09(月) 01:35:42
>>518
DATAの定義の前に

#if sizeof(char) != sizeof(unsigned char)
  #error ( ゚Д゚)うごー
#endif
0521デフォルトの名無しさん2005/05/09(月) 01:38:25
>> 518 int型にすればいい
0522デフォルトの名無しさん2005/05/09(月) 01:39:00
>>518
そういうニーズがどこにあるのかわからんので
いまいちイメージできないのだが
0523デフォルトの名無しさん2005/05/09(月) 01:46:38
>>522
-127〜255までの数をcharで扱おうというケチ精神
0524デフォルトの名無しさん2005/05/09(月) 01:49:00
>>520
sizeof(char) != sizeof(unsigned char)
↑みたいなこともあるんですか?

>>521
すみません。
charで書いたけど、long intの場合もあるんです・・・
Dataのサイズがlong intだとすると、
取り込むときは

for(i=0; i<40; i++){
  Data[i].ul=*(unsigned long *)(0x020000+i*4);
}
みたいに取り込んで、取り込んだ値を使うときは、符号付きだったり、符号なしだったりするという感じです。

>>522
メモリに直接アクセスするような使い方です。
0525デフォルトの名無しさん2005/05/09(月) 01:56:57
データ保持する配列はunsigned longにでも決め打ちして、
使うときにsignedかunsignedかをキャストして変えればいいんじゃないの?
0526デフォルトの名無しさん2005/05/09(月) 02:27:42
>>525
その場合に、桁が大きくなるのでcharで書くと、
unsigned charで255という値を受け取って、それをsigned charとして扱いたい(-1として扱いたい)ときに、
signed charにキャストできるのかどうかがちょっと不安です。
05273732005/05/09(月) 02:35:53
色々と意見を下さった多くの方々、ありがとうございました。
0528デフォルトの名無しさん2005/05/09(月) 02:45:10
>>523
>-127〜255までの数をcharで扱おうというケチ精神

実データの8ビットに加えて型情報も
保持しなきゃならんのだから1バイトじゃ無理。
節約どころか技術の浪費。

>>526
>unsigned charで255という値を受け取って

これが 0xFF であることを保証したいなら
代入文使わずに memcpy でも使えば?
0529デフォルトの名無しさん2005/05/09(月) 03:04:38
>>526
できる
0530デフォルトの名無しさん2005/05/09(月) 04:54:54
>>258
変数自体は型情報をもたない。型情報は内部の変数テーブルに記述されているのみ。
構造体のバイナリ―保存考えれば普通に分かるはず。
0531デフォルトの名無しさん2005/05/09(月) 05:16:44
>>531
(・∀・)ヘイヘーイ!!
0532デフォルトの名無しさん2005/05/09(月) 05:17:05
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
0533デフォルトの名無しさん2005/05/09(月) 05:25:08
処理に要するCPU clock数の削減
0534デフォルトの名無しさん2005/05/09(月) 06:31:02
>>532
例えば圧縮のように本質的にビット単位のアプリの記述
0535デフォルトの名無しさん2005/05/09(月) 06:32:28
>532はコピペ
0536デフォルトの名無しさん2005/05/09(月) 07:02:38
>>529
処理系依存
0537デフォルトの名無しさん2005/05/09(月) 09:50:34
>>500 ってどういう意味?
それってC以外のブログラミング言語なら書けるの?
プログラミング言語レベルの話し?
05385282005/05/09(月) 11:07:25
>>530
char配列のどのインデックスがsignedかunsignedかを保持するための
別の変数が必要っていう意味で書いたんだが、518からのレスを読み返すと、
思ってた用途と違うっぽいな。
0539デフォルトの名無しさん2005/05/09(月) 11:42:14
指定文字列で分解できる関数ありませんか?
strtokは文字なので不可でお願いします。
0540デフォルトの名無しさん2005/05/09(月) 11:49:25
strstr とか?
0541デフォルトの名無しさん2005/05/09(月) 11:55:22
何を分解するの?
0542デフォルトの名無しさん2005/05/09(月) 11:55:43
(int)ってどういぅ意味ですか?
0543デフォルトの名無しさん2005/05/09(月) 11:56:16
>>518
やりたい事をもっと具体的に書いた方がいいと思う。
0544デフォルトの名無しさん2005/05/09(月) 11:57:08
>>539
ない

>>542
キャスト
05455422005/05/09(月) 11:59:22
>>544
ありです
0546デフォルトの名無しさん2005/05/09(月) 12:19:52
http://dhcp21-040.ctb.ne.jp/
wwwおkwwwうはっwwwうはっwwwwっうぇうぇwww
wwwwwwwwwwwwwwwwwwっうぇ
wwwwwwwwwwwwwっうぇっうぇうぇwww
0547デフォルトの名無しさん2005/05/09(月) 12:29:01
Txtファイルに、-1.23 3.02
2.33 1.24
こんなふうに、1行に2つの数が間にスペースをはさみ保存されてて
それが200行ほどあります。配列A[1][1]に一行目の最初の数、
A[1][2]に1行目の2つ目の数のように入れていくには
どうすればよいですか?
0548デフォルトの名無しさん2005/05/09(月) 12:41:17
scanf
0549デフォルトの名無しさん2005/05/09(月) 12:44:41
>>547
for文+fgets()+sscanf()
0550デフォルトの名無しさん2005/05/09(月) 12:47:15
548は召喚呪文を唱えた
0551デフォルトの名無しさん2005/05/09(月) 13:14:55
>>549
ググッてもよくわからんかったとです。
具体的なプログラム教えてくれませんか?
0552デフォルトの名無しさん2005/05/09(月) 13:42:05
551 をどう料理したらいいか
0553デフォルトの名無しさん2005/05/09(月) 13:42:11
>>551
> ググッてもよくわからんかったとです。

何がわからなかったんだ?

> 具体的なプログラム教えてくれませんか?

宿題スレに行け。
0554デフォルトの名無しさん2005/05/09(月) 13:53:13
>>539
今更新たに関数を作るなんてことしないで
POSIX regex.h の regcomp/regexec/regfree

VSでは標準で入ってないのでGNU Rxを使う
ソース:http://directory.fsf.org/libs/c/rx.html
マニュアル:
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/regcomp.3.html
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/regexec.3.html
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/regfree.3.html
日本語解説とVC用ファイル:http://www.sip.eee.yamaguchi-u.ac.jp/kou/regex.html

>>547
enum{arbital=20,max=200+arbital};float a[max][2];int n;for(n=1;n<max&&sscanf("%f %f",&a[n][0],&a[n][1])>0;n++);n>=max&&exit(EXIT_ERROR);
05555542005/05/09(月) 13:54:29
違った
>>547
enum{arbital=20,max=200+arbital};float a[max][3];int n;for(n=1;n<max&&sscanf("%f %f",&a[n][1],&a[n][2])>0;n++);n>=max&&exit(EXIT_ERROR);
0556デフォルトの名無しさん2005/05/09(月) 13:55:48
>>553
宿題スレに逝って来ます
0557C言語勉強中2005/05/09(月) 13:55:51
多次元配列を動的に確保した場合、要素数取得するにあたって、
その数を別の変数に記憶しておくしか方法はないでしょうか?
例えばですが、、、

<file>
ああ、いい、うう
ええ、おお、かかか、きききき
くくくくくく
・・・・

といった風なファイルを読み、p[0][0] = ああ p[0][1] = いい
p[0][2] = うう p[1][0] = ええ ・・・
といった感じで***pから3次元に動的に確保していったとします。
そこで上の例でいうとp[0]の要素数3、p[1]の要素数4といったものを
取得することは簡単にできるのでしょうか?
0558デフォルトの名無しさん2005/05/09(月) 13:59:10
> p[0][0] = ああ p[0][1] = いい
> p[0]の要素数3、p[1]の要素数4

何故、p[0]が要素数 3 で、p[1]が要素数 4 となる?
あと、型くらい書け。
0559デフォルトの名無しさん2005/05/09(月) 14:03:42
>>557
出来ない。
自前で覚えておけ。
0560デフォルトの名無しさん2005/05/09(月) 14:04:05
すみません。char ***p;です。
p[i][j][k]とあったら、p[i]に対するjの要素数を知りたいのです。
iが何行目か。jが"、"の何個目の文字か。kがjの文字配列という形です。
0561C言語勉強中2005/05/09(月) 14:05:01
やはりできないですか。わかりました。。
0562デフォルトの名無しさん2005/05/09(月) 14:06:18
> ***p

多次元配列をよく分かっていない気配
0563デフォルトの名無しさん2005/05/09(月) 14:08:04
C99とかの話?
0564デフォルトの名無しさん2005/05/09(月) 14:08:53
>>560
配列である以上、

 p[0]の「p[0][0]〜p[0][N]」の数

と、

 p[1]の「p[1][0]〜p[1][N]」の数

は、同じでないとおかしい。
0565C言語勉強中2005/05/09(月) 14:13:03
>>564
いわれてみればそうですが、malloc等使えばそのNを可変にできますよね?
これがメモリを節約する方法かと思っていたのですが違うんでしょうか?
0566デフォルトの名無しさん2005/05/09(月) 14:17:08
それは多次元配列とは言わない
0567デフォルトの名無しさん2005/05/09(月) 14:18:40
なるほど。。。使い方としてはOKですよね?例えば、、、

char **ps;
ps = (char **)malloc(sizeof(char *) * 2);
ps[0] = (char *)malloc(3);
ps[1] = (char *)malloc(2);
strcpy(ps[0], "TT");
strcpy(ps[1], "A");
free(ps[0]);
free(ps[1]);
free(ps);

ってのはアリですよね?
0568デフォルトの名無しさん2005/05/09(月) 14:32:29
mallocは一応割り当てたサイズをメモリのどっかに記憶してるけど誰にも見せないようにしているし
0569デフォルトの名無しさん2005/05/09(月) 14:44:00
あえて別の配列を作らないようにするならトリッキーな方法として

char **ps;
ps = (char **)(1+(size_t*)malloc(sizeof(size_t) + sizeof(char *) * 2));
((size_t*)ps)[-1] = 2;
...
free((size_t*)ps-1);

みたいにすれば配列らしいアクセシビリティを維持しながらメモリも節約できる.
0570デフォルトの名無しさん2005/05/09(月) 14:47:11
そういうのはリストにすれば
0571デフォルトの名無しさん2005/05/09(月) 14:49:06
質問なんですが、
Charポインタ型からChar型に変換するにはどうすればいいんですか?
0572デフォルトの名無しさん2005/05/09(月) 14:52:07
標準入力からfgetsで文字列を受け取る時、指定サイズ以上だったら
セグメンテーションフォルトになりますが、この時エラー出力をするように
は戻り値のNULL判定をしてやればよいのですか?
また、この時のメモリーにいたずらを施すことができるのか教えてください。
0573テキストボックスの幅2005/05/09(月) 14:57:00
C++.NETでテキストボックスの幅をドラッグして倍に伸ばして保存した
のですが・・
アプリを立ち上げてみるとテキストボックスのプルダウンメニューの
中身が空(空白)になってしまいます。
どなたかテキストボックスの幅を伸ばしてもプルダウンメニューの
表示に影響を及ばさないやり方をご教授していただけないでしょうか。
緊急で困っておりますので宜しくお願いします。
0574C言語勉強中2005/05/09(月) 14:59:13
>>569
トリッキーですね、、勉強になります。しかし理解できませんでした。。
((size_t*)ps)[-1] = 2;
なぜこんな代入が可能なのでしょうか??-1というのがどうも理解不能です。
0575デフォルトの名無しさん2005/05/09(月) 15:07:48
>>573
幅を倍にしても影響はないし、
テキストボックスにプルダウンメニューはないし、
標準 C にはテキストボックスなどありません。
0576デフォルトの名無しさん2005/05/09(月) 15:08:25
>>572
日本語で話して下さい。
0577デフォルトの名無しさん2005/05/09(月) 15:12:26
>>571
意味不明。具体的でないとさっぱりわからん。
0578デフォルトの名無しさん2005/05/09(月) 15:13:25
> fgetsで文字列を受け取る時、指定サイズ以上だったら
> セグメンテーションフォルトに

なりません。
05795722005/05/09(月) 15:15:38
>>576

勘違いしてました。セグメンテーションフォルトには奈良ないっすね;
0580テキストボックスの幅2005/05/09(月) 15:53:22
テキストボックスの下にプルダウンメニューを配置しています。
C++.netでテキストボックスの幅を二倍にするとプルダウンメニュー
の表示が空になってしまうのです。
0581デフォルトの名無しさん2005/05/09(月) 16:03:23
>>569>>574
すいません悪い癖が出てしまいました.
*((size_t*)ps-1) = 2;
の方が適切です.
0582デフォルトの名無しさん2005/05/09(月) 16:07:22
>>580
激しくスレ違い。タイトル嫁。

>>579
fgets()の使い方は判ってる?
0583デフォルトの名無しさん2005/05/09(月) 16:08:45
>>581
別に((size_t *) ps)[-1]で問題ないと思うが。
Cの[]演算子を理解していないらしい>574にあわせる必要はない。
0584デフォルトの名無しさん2005/05/09(月) 16:09:20
>>580
IDEのバグじゃないか?
0585デフォルトの名無しさん2005/05/09(月) 16:11:56
>>584
藻前も答えんなや。
0586デフォルトの名無しさん2005/05/09(月) 16:18:55
>>581>>583
記述の意味はわかりますが、どうもどこからメモリがあるのかよくわからんです。
-1の位置からメモリ領域がとられているのですか??
例えば・・・
char *p;
p = (char *)malloc(5);
p[0]〜p[4]まで。というイメージなのですが。。
0587デフォルトの名無しさん2005/05/09(月) 16:24:29
#いや、これは俺の心の中に住み着いた悪魔が嫌がらせしているのだろう。。。
#もう一つ見つけた悪い癖
ps = (char **)(1+(size_t*)malloc(sizeof(size_t) + sizeof(char *) * 2));
↓
ps = (char **)((size_t*)malloc(sizeof(size_t) + sizeof(char *) * 2)+1);
#無駄な議論になるからノーコメントで
0588デフォルトの名無しさん2005/05/09(月) 16:39:16
スペルも間違ってたotz
でもコンパイルだけは通るから。。。
0589デフォルトの名無しさん2005/05/09(月) 16:40:30
>>586
その認識でよし。

>>587
見にくいし、free() する時も面倒あるし、my_malloc() と my_free() 作ったらどうだ?
0590 ◆Sqi4jGZgn2 2005/05/09(月) 17:45:04
C初心者です
printf("\x1b[2J")
と書くと画面が消去される、とあるサイトに書いていたのですが、
やってみると消去されず何か文字が表示されます。
使っているのはBCCです。
何か画面を消去する方法があれば教えてください。
0591デフォルトの名無しさん2005/05/09(月) 17:47:49
>>590
どのOSのどの画面を消したいの?
\x1b[2J はANSIエスケープシーケンスの画面消去だな

つか、専用スレ行きじゃないか
05925902005/05/09(月) 18:03:28
解決しました
0593デフォルトの名無しさん2005/05/09(月) 18:07:37
char p[3][100];
char *ps[3];

strcpy(p[0], "BBBBBB");
strcpy(p[1], "AAAAAA");
strcpy(p[2], "XXXXXX");
qsort(p, 3, 100, compare);

ps[0] = "BBBBBB";
ps[1] = "AAAAAA";
ps[2] = "XXXXXX";
qsort(ps, 3, sizeof(char *), compare2);

int compare(const void *x,const void *y){
return strcmp((char *)x, (char *)y);
}

int compare2(const void *x,const void *y){
return strcmp(*((char **)x), *((char **)y));
}

比較関数にはいってくる*x,*yが今一つ理解できません。上記2つとも同じように
ダブルポインタが来るように思えて仕方ないのですが。それぞれどういった風に
比較関数に入ってきているのでしょうか?
0594590 ◆Sqi4jGZgn2 2005/05/09(月) 18:07:58
>>592
これは書き込んだ覚えないんですが・・・
>>591
printf("\x1b[2J") と入力してなるのと同じようにするんです
BCCではできないみたいなので・・・
0595デフォルトの名無しさん2005/05/09(月) 18:16:02
>>593
図を書いて考えれ。

# 後、「ダブルポインタ」なんてオレ用語使うな。

>>594
スレ違い
0596デフォルトの名無しさん2005/05/09(月) 18:21:31
>>593
開発環境がなんだかわからないけど、統合環境で変数のインスペクトが可能なら
比較関数内にブレーク置いていろいろキャストしてみたりしてアドレスやら値やら見ると
すこしは理解につながるかもね。
>>595
ポインタのポインタでおk?
0597デフォルトの名無しさん2005/05/09(月) 18:36:07
>>520 の
#if sizeof(char) != sizeof(unsigned char)
  #error ( ゚Д゚)うごー
#endif
は、ネタなんですか?
sizeof(char) != sizeof(unsigned char) みたいなのはありえるのでしょうか?
524 の人じゃないけど、ぼくもふしぎにおもいました。
0598デフォルトの名無しさん2005/05/09(月) 18:38:55
>>594
標準出力でなく<conio.h>の関数で書き込むのでは?
0599デフォルトの名無しさん2005/05/09(月) 18:39:33
>>598
うんこ氏ね。
06005902005/05/09(月) 18:42:37
>>598
ありがとうございます
0601デフォルトの名無しさん2005/05/09(月) 18:44:56
だから環境によって違うんだからそれなりのスレいったほうがいい
98、MeならANSI.SYS組み込んだかどうかでも違ってくるし
0602デフォルトの名無しさん2005/05/09(月) 18:46:19
>>572
> 標準入力からfgetsで文字列を受け取る時、指定サイズ以上だったら
> セグメンテーションフォルトになりますが、
前提条件から間違っている。getsとfgetsは別物だ
0603デフォルトの名無しさん2005/05/09(月) 18:54:46
>>597
0604デフォルトの名無しさん2005/05/09(月) 19:50:04
ネタですから気にしないように。
次
0605デフォルトの名無しさん2005/05/09(月) 20:22:49
exit()の前にfree()はすべきでしょうか?
0606デフォルトの名無しさん2005/05/09(月) 20:26:27
>>605
そのネタもう秋田
0607デフォルトの名無しさん2005/05/09(月) 20:31:16
いいかげんそろそろ fopen で Socket 開けて良いと思う
0608デフォルトの名無しさん2005/05/09(月) 20:41:32
>>605
既出。さようなら。
0609デフォルトの名無しさん2005/05/09(月) 21:20:04
え、ダブルポインタって用語存在しないの?
0610デフォルトの名無しさん2005/05/09(月) 21:29:44
double*
0611馬鹿学生2005/05/09(月) 21:45:40
c言語でa=1〜10、b=5〜15、c=10〜1という10個の解を求めるプログラムやり方教えてください。
0612デフォルトの名無しさん2005/05/09(月) 21:47:19
main()
{
int a, b, c, printf();
for(a = 1; a <= 10; a++)
for(b = 5; b <= 15; a++)
for(c = 10; c >= 1; --c)
printf("%d %d %d\n", a, b, c);
}
0613デフォルトの名無しさん2005/05/09(月) 21:50:40
>>609
就職面接で、「ダブルポインタなら判りますけどトリプルポインタは自信がありません」と答えた香具師もいる。
要は、ポインタを理解していない連中が、わかった気になるためのおまじない。
0614デフォルトの名無しさん2005/05/09(月) 21:56:09
HP の中途採用の面接の様子が書かれた本があったよな
確か循環リストの話だったような・・・
0615デフォルトの名無しさん2005/05/09(月) 22:00:19
M$でも見ますた。
某Lisp言語仕様書に載ってる関数に基づいて
Cのコード書いたんだけど、召されませんですた。
0616デフォルトの名無しさん2005/05/09(月) 22:34:32
ポインタのポインタ?
0617デフォルトの名無しさん2005/05/09(月) 22:55:44
ポインタへのポインタ
0618デフォルトの名無しさん2005/05/09(月) 22:57:54
ポインタへのポインタへのポインタ
0619デフォルトの名無しさん2005/05/09(月) 23:22:40
ポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのポインタへのヌルポ
0620デフォルトの名無しさん2005/05/09(月) 23:40:40
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__∧∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>619
0621デフォルトの名無しさん2005/05/10(火) 00:01:40
#include<stdio.h>
int main(void)
{
char *pc="abcd";
char **ppc=&pc;

printf("%s",**ppc);

return(0);
}

「pc」には文字列のアドレスが入っていて、
「ppc」には「pc」のアドレスが入っているのは間違いないですよね?
なぜこれを実行してもエラーがでてしまうのでしょうか、
**ppcとはppcの中身の中身なのだから、abcdが表示されるように思えるのですが…。
0622デフォルトの名無しさん2005/05/10(火) 00:07:53
>>621
pcを表示するためには
printf("%s",pc);
なんだから(これが分からなければ出直しといで)、
printf("%s",*ppc);
0623デフォルトの名無しさん2005/05/10(火) 00:25:50
>>623
にこいじょうつながないで、わからなくなるから
0624デフォルトの名無しさん2005/05/10(火) 00:44:21
ポインタがわからん奴はファイル名とファイルの中身
URLとURLが指し示すHTMLの関係を良く考えろ
0625デフォルトの名無しさん2005/05/10(火) 00:51:34
ラピュタが実体で、飛行石がポインタ
0626デフォルトの名無しさん2005/05/10(火) 01:05:09
条件式の中で条件演算子じゃなくて論理演算子で式を結ぶのはアリ?

if( hoge==1 & foo==0 & bar!=5 ){
//ニャホニャホ
}
0627デフォルトの名無しさん2005/05/10(火) 01:08:28
>>626
条件次第
0628デフォルトの名無しさん2005/05/10(火) 01:19:48
>>627
というと?
0629デフォルトの名無しさん2005/05/10(火) 01:20:51
>>626
条件が真になる可能性が高いならスケジューリングしやすい分速くなるんだっけ
0630デフォルトの名無しさん2005/05/10(火) 01:31:01
>>626
if(条件式&条件&条…) {}
のように全てが条件式(例外もあるが…)で全ての式を評価しても良いならOK
0631デフォルトの名無しさん2005/05/10(火) 01:43:17
論理演算子と条件演算子を使った場合の違いは速さなのか・・・
本を読んでも条件式の中では条件演算子を使うとしか書いてなかったので知らなかったよ
で、速さ以外は特に違いはないの?
速さの違いは
全部の式を評価してから分岐するのが論理演算子、
条件が不成立したら全部評価する前に分岐してしまうのが条件演算子
ということでOK?
0632デフォルトの名無しさん2005/05/10(火) 01:53:32
>>631
>論理演算子と条件演算子を使った場合の違い
bit演算(&)を行うか、論理演算(&&)を行うかの違い
&は、論理演算ではないし、&&は条件塩山市ではないので注意
0633デフォルトの名無しさん2005/05/10(火) 04:53:51
>>631 あんまりわかってないようなので付け加えるが、
全ての式を評価するか否かにより「速さ」が変わることよりもむしろ、
「実行結果」自体が変わり得ることに気をつけたほうがいい。
というかそもそもビット演算子を論理演算子の代わりに
使うってのが間違ってるんだが。(用語は>>632を参照)

// @挙動が変わる例
bool a=false;
bool b(){ printf("unko"); return false; }
if(a && b()){ //unkoは表示されない
 //実行されない
}
if(a & b()){ //unkoが表示される
 //実行されない
}

// @判定自体が変わる例
int f(){ return 1; } //nonzeroを返してるつもり
int g(){ return 2; } //nonzeroを返してるつもり
if(f() && g()){ // true && true → true
 //実行される
}
if(f() & g()){ // 1 & 2 → 0 → false
 //実行されない
}

「&&」と「&」の見た目が似てるから互いに代用が利くように
見えるのかもしれないけど、「&」や「|」は「&&」や「||」よりも
むしろ「+」とか「*」に近い分類の演算子だよ。
君の質問は、
「if(a || b)の代わりにif(a + b)でもいいですか?」
に似たようなものなのです。(オーバーフローしない限りはこれもアリのこともあるが)
0634デフォルトの名無しさん2005/05/10(火) 06:07:57
なんかよくわからんもの拾ってました。ナンでスカ?これは。
int main(int argc, char* argv[])
{
char buf[4];/*念の為*/
for (; ;)
{
read(0,buf,1); /*←不明。*/
putchar((int)*buf);
write(1,buf,1);
}/*CTRL+Cで終了*/
return 0;
}
0635デフォルトの名無しさん2005/05/10(火) 06:36:09
言い換えれば
#include <unistd.h>
read(STDIN_FILENO,buf,1);
write(STDOUT_FILENO,buf,1);
0636デフォルトの名無しさん2005/05/10(火) 08:49:00
c言語の本でおすすめ、「これは初心者にでもスーパーわかりやすい」
は、ありませんか?
0637デフォルトの名無しさん2005/05/10(火) 09:01:27
バカは何読んでも同じ
0638デフォルトの名無しさん2005/05/10(火) 09:12:51
>>636
スレ違い
06395392005/05/10(火) 11:52:25
>>554
ご丁寧にありがとうございました。
これでできそうです。
助かりました。
0640デフォルトの名無しさん2005/05/10(火) 12:56:21
read / write って標準Cだっけ?
とか言ってみるテスト
0641デフォルトの名無しさん2005/05/10(火) 13:21:40
>>640
unistd.hなら半標準じゃね?知らんけど
0642デフォルトの名無しさん2005/05/10(火) 13:39:13
POSIX とかでは標準だろうけど、C 規格では非標準なんじゃねーの?
出先だから規格票持ってねーぜ、ヒャッハー(^Д^)
0643デフォルトの名無しさん2005/05/10(火) 18:14:58
nを入力して1〜nの素数を表示し、その素数の合計を表示するプログラム教えてくださいm( _ _)m
0644デフォルトの名無しさん2005/05/10(火) 18:19:03
「エラトステネスのふるい」をググれ。
0645デフォルトの名無しさん2005/05/10(火) 18:19:58
つーかスレ違い?
0646デフォルトの名無しさん2005/05/10(火) 20:04:01
プログラムのコメントを消去する方法おしてください。
//はできたのですけど、
/* */の削除がわからないです。
/*
*
*/
と行をはさむ場合の削除方法がわかりません。
どなたかご教授願います。

//の削除プログラムは載せておきます。
よろしくお願いします。

 //の削除プログラム 
while (fgets(string_buf, SIZE, filep_in) != NULL)
{
// //があったとき一つ目の/まで読み込みを繰り返す。
for (i = 0; string_buf[i] != '/' || string_buf[i + 1] != '/'; i ++)
{
//改行になったらfor文のループを抜ける
if (string_buf[i] == '\n')
break;
}
// //のある場所の一つ目の/に改行をいれる。二つ目の/以降は読み込まない。
strcpy(string_buf + i, "\n");
}
0647デフォルトの名無しさん2005/05/10(火) 20:09:42
>>643
ぼるじょあがC/C++の宿題を片づけますYO! 42代目
http://pc8.2ch.net/test/read.cgi/tech/1113811213/
0648デフォルトの名無しさん2005/05/10(火) 20:11:34
>>640
非標準
0649デフォルトの名無しさん2005/05/10(火) 20:15:29
>>646
クオートされた部分を除外しないと
0650デフォルトの名無しさん2005/05/10(火) 20:48:07
>>646
先頭から一文字ずつ見ていって、
/*が来たらコメント開始。
*/が来たらコメント終了。
ただし、文字列の中では無視。
0651デフォルトの名無しさん2005/05/10(火) 20:57:21
>>646
全部いっぺんにやろうとするから辛くなるんだよ
本物のコンパイラだって、プリプロセッサ→パーサ→コードジェネレータ→リンカみたいに流れ作業してるだろ
その問題の意図は鉄砲玉みたいなやり方の矯正だったりしないか?
0652デフォルトの名無しさん2005/05/10(火) 21:07:55
>>646
gcc -E
じゃ駄目か? #defineも展開されるけど...
0653デフォルトの名無しさん2005/05/10(火) 21:08:46
こんなもの一辺にやれよ
遷移図?ぐらい書けるだろうよ
0654デフォルトの名無しさん2005/05/10(火) 21:09:19
状態遷移の練習でしょ。
0655デフォルトの名無しさん2005/05/10(火) 21:12:55
   __(^^) <ペイピッポォ
  /__ \
  | |   |  |
  (_) (__)
0656デフォルトの名無しさん2005/05/10(火) 21:15:11
>>646
fgets ではなく fgetc な
0657デフォルトの名無しさん2005/05/10(火) 22:43:07
つうか>>646はFSMを作れとかいう課題だったり
06584642005/05/10(火) 22:49:35
おくれました。
スキルアップのつもりで考えたんですけど
ちっとまだ知識が足りないみたいっす。
状態繊維とかいみわからないっす。
06596342005/05/11(水) 00:32:57
>>635
有難うございました。
0660デフォルトの名無しさん2005/05/11(水) 00:46:19
C++のset_intersectみたいな積集合を求めるCの関数が欲しいのですけどありませんか?
0661デフォルトの名無しさん2005/05/11(水) 01:52:28
long が 4byte の環境で,

unsigned long U, u1, u2;
u1 = 0x00000009;
u2 = 0xFFFFFFFF;
U = u1 + u2;
unsigned はオーバーフローしないということなので
これが 0x00000008 になるのは理解できましたが,

U = u1 - u2;
これで U が 0x00000010 になるのが直感的にわかりません.

0x00000009 - 0xFFFFFFFF が
0x00000009 + 0x00000001 になっている?

0662デフォルトの名無しさん2005/05/11(水) 01:54:37
0x9 + 0x1が0x10とは初耳だ
0663デフォルトの名無しさん2005/05/11(水) 02:13:40
C言語のやりたいんですがソフトはどこにあるんですか?>>1は意味がわかりませんでした初心者ですみません。
0664デフォルトの名無しさん2005/05/11(水) 02:58:36
int
main()
のように関数名を行頭にするスタイルはなんていうんですか?
0665デフォルトの名無しさん2005/05/11(水) 03:02:14
>>663
>1も理解できないなら人間止めた方がいいよ。

>>661
0xffffffffを引くことは即ち-1を引くこと。したがって、+1になる。
よって、0xa。
#アンダーフローしているわけだね。
0666デフォルトの名無しさん2005/05/11(水) 03:46:41
>>660
非常に簡単だから自分で作ったら良いと思う.
0667デフォルトの名無しさん2005/05/11(水) 10:05:50
>>661
検算してごらん
0668デフォルトの名無しさん2005/05/11(水) 10:24:14
>>661
> unsigned はオーバーフローしないということなので

いや、するぞ。
0669デフォルトの名無しさん2005/05/11(水) 10:24:38
663の>>1は>>2の間違いでした
0670デフォルトの名無しさん2005/05/11(水) 10:26:02
どうしてもソフトでコンパイルできるところまでに至りません
0671デフォルトの名無しさん2005/05/11(水) 10:34:20
ではどこまで至ったんだ
0672デフォルトの名無しさん2005/05/11(水) 10:37:31
若毛の至り
0673デフォルトの名無しさん2005/05/11(水) 11:06:07
質問です。
K&Rの第二版のサンプルプログラムをコンパイルすると、
main()関数は値を返すべき、とエラーメッセージが出ます。

これはreturn文が無いからだとは分かるのですが、
main()関数へreturn文の記述必要性がわかりません。
(どの関数に呼び出されている訳でもないので)

どなたか説明御願いします。
0674デフォルトの名無しさん2005/05/11(水) 11:07:18
>>668
unsignedは恥メッカら(最大値+1)を法とする算術規則に従うって仕様で決まってるんだから
最大値を超えたときに剰余をとるのはオーバーフローじゃない
0675デフォルトの名無しさん2005/05/11(水) 11:14:59
>>674
でもオーバーフローって言った方が分かりやすいよな

>>673
mainの戻り値はexit()に渡される引数と同じ。
んで、exit()は、システムにプログラムの正常終了、異常終了(っていうのか?)を知らせる。
0676デフォルトの名無しさん2005/05/11(水) 11:16:26
せつめいすると、
そのメッセージは
エラーでなくて警告で

main()はint型を返す
型を省略すると勝手にint型を返す、
return文を省略すると、適当な値を返す
ということになっていて、

戻り値は、そのプログラムをfork() && exec()した
ttyの親プロセスである、shが参照

せつめい、おわり
0677デフォルトの名無しさん2005/05/11(水) 11:16:49
>>673
スタートアップルーチンがmainを呼んでいる
が、エラーにはならんでしょ(ウォーニングは出るかも)
intで宣言してんじゃないの?
0678デフォルトの名無しさん2005/05/11(水) 11:20:32
>675-677

よくわかりました。ありがとうございます。

読み返したら日本語が大分間違ってました・・・
エラーが出たのではなく、警告が出た、でした。
0679デフォルトの名無しさん2005/05/11(水) 15:49:49
>>676
現在では型を省略することは出来ない。
0680デフォルトの名無しさん2005/05/11(水) 15:52:53
>>676
最後の段の説明は一部のOSに特化している。
戻り値を親プロセスが参照する義務はないし、実際全く参照しないコマンドインタプリタもある。
逆に、0以外を返されると警告を出すコマンドインタプリタもある。
0681デフォルトの名無しさん2005/05/11(水) 16:43:28
フォルダの中のファイルの監視をしたいのですが
下のコードを実行して c:\test フォルダ内のファイルの内容を変更すると
メッセージボックスが二回表示されてしまいます。
変更は一回しかしていないのに二回でてしまうのですが
ここまでコードを短くしても出るので行き詰まってしまいました
二回検知してしまう動作が正しいのでしょうか?
どこかおかしくて二回出てしまうのならばご指摘お願いします。

HANDLE hFind = FindFirstChangeNotification( "C:\\test\0", FALSE, FILE_NOTIFY_CHANGE_SIZE );
if( hFind == INVALID_HANDLE_VALUE )
  return;

while( 1 )
{
  DWORD ret = WaitForSingleObject( hFind , INFINITE );
  if( ret == WAIT_OBJECT_0 )
  {
    MessageBox( NULL, "TEST", "Changed!", MB_OK );
    if( FindNextChangeNotification( hFind ) == 0 )
      return;
  }
}
FindCloseChangeNotification( hFind );
0682デフォルトの名無しさん2005/05/11(水) 16:49:05
乱数を発生させるには、まず乱数の初期化が必要との事なんですが乱数を初期化する命令文は
どうやって書くのですか?どなたか教えてください
0683デフォルトの名無しさん2005/05/11(水) 16:50:22
>>682
srand(time(NULL));
0684デフォルトの名無しさん2005/05/11(水) 16:51:51
>>682
srand(clock());
0685デフォルトの名無しさん2005/05/11(水) 16:52:53
>>681
スレ違い
Win32API スレ逝け
06866812005/05/11(水) 16:56:57
Win32APIスレ逝って来ます
なので私の質問は閉じます
06876822005/05/11(水) 16:57:58
>>683-684
どちらの方も有難うございます。どっちが正解なのかな・・・
両方使えるってことですかね
0688デフォルトの名無しさん2005/05/11(水) 17:02:01
pbuf = (char *)malloc(10000);
for( i = 0; i < 10000; i++ ){

……

*(pbuf + i) = c;
}

といった処理があるんですが、この10000が4294967295より大きくなってしまったとき
どうすればいいかわかりません
単純にiをdoubleにしても「ポインタに整数でない値を加えようとしました」エラーに
なってしまいます
0689デフォルトの名無しさん2005/05/11(水) 17:31:17
>>688
そういう値を受け入れることが出来る型でiを定義する。
0690デフォルトの名無しさん2005/05/11(水) 17:33:33
32bit環境なら無理だな
越えられない
0691デフォルトの名無しさん2005/05/11(水) 17:33:41
すごい時代になったもんだな
0692デフォルトの名無しさん2005/05/11(水) 17:33:42
>>688
あなたの使っているコンピュータでは多分 4294967295 より大きくなってしまったとき
に malloc() が失敗します。
0693デフォルトの名無しさん2005/05/11(水) 19:42:53
>>688
例えば i に(unsigned )long long intとかを使う。
そもそもそんな環境でそれだけのメモリを確保できるかどうかは疑問だが。
ところでさ、pbuf[i]って書こうよ。
0694デフォルトの名無しさん2005/05/11(水) 20:20:56
>>693
スタイルの強要はやめていただきたい
0695デフォルトの名無しさん2005/05/11(水) 20:37:20
半角文字の0〜9を数値の0〜9に直す場合
0x30を引く方法って一般的な方法でしょうか?
それとも他に何かありますか?
0696デフォルトの名無しさん2005/05/11(水) 20:39:37
>>695
よく見る。
c - 0x30 よりは c - '0' のほうが分かりやすい。
0697デフォルトの名無しさん2005/05/11(水) 20:54:10
わかりやすいだけでなく移植性もある。
0698デフォルトの名無しさん2005/05/11(水) 20:54:49
ASCII依存かよと絡んでみる
0699デフォルトの名無しさん2005/05/11(水) 21:00:14
>>688
○bitCPUが扱えるメモリは(仮想メモリ含めて)そのビット数で表現できる値までなのでそういうくだらない心配をする必要は無い
0700デフォルトの名無しさん2005/05/11(水) 21:47:21
>>664
GNU Coding Standard
0701デフォルトの名無しさん2005/05/11(水) 21:52:00
目的を定義しないスタイル論争に出口なし
0702デフォルトの名無しさん2005/05/11(水) 21:53:48
>>699
8086
0703デフォルトの名無しさん2005/05/11(水) 22:03:55
( ゜д゜)ポカーン
0704デフォルトの名無しさん2005/05/11(水) 22:45:55
>>701
おっ、名言が生まれたよ
0705デフォルトの名無しさん2005/05/11(水) 23:08:57
char mozi[] ="unkounkounko";
int sum;

for(int i=0; i < 12; i++) { sum = sum + mozi[i]; }

このようにすれば変数moziの1バイトごとの合計値は求めれると思うのですが
2バイトごとに求めるにはどうしたらいいでしょうか?教えてくださいお願いします。
0706デフォルトの名無しさん2005/05/11(水) 23:12:42
i += 2 とか
0707デフォルトの名無しさん2005/05/11(水) 23:13:59
sumは0に初期化しとけよ
0708デフォルトの名無しさん2005/05/11(水) 23:22:55
20通りくらいのパターンをswitch文を使って表しているのですが、
switchは遅いという情報を見つけました。
ifで表現したら速くなりますか?
0709デフォルトの名無しさん2005/05/11(水) 23:23:45
>>699
(スレ違い気味だが) データ幅とアドレス幅は無関係。
0710デフォルトの名無しさん2005/05/11(水) 23:26:16
>>708
君が気にする程違うわけでもなし、
気にしないといけない程
クリティカルなプログラムも書かないだろうし、
何よりコンパイラのオプティマイザに任せた方が
余程いい結果が得られる。
0711デフォルトの名無しさん2005/05/11(水) 23:27:48
そもそも case や else がアホみたいに出てくるのは
良くない設計の兆候。まずは設計を見直せ。
0712デフォルトの名無しさん2005/05/11(水) 23:40:45
>>711
char buf[...];
int n=0;

switch(buf[i]){
case 'b':
 i++;
 switch(buf[i]){
 case 'a':
  i++;
  switch(buf[i]){
  case 'k':
   i++;
   switc(buf[i]){
   case 'a':
    i++;
    return;
   }
  }
 }
}

みたいなコードに出会ったことあるYO。久々に殺意を覚えた。
0713デフォルトの名無しさん2005/05/11(水) 23:41:10
i→n
0714デフォルトの名無しさん2005/05/11(水) 23:42:02
>>708
switchをジャンプテーブルに変換してくれるコンパイラならifより速い
0715デフォルトの名無しさん2005/05/11(水) 23:49:47
>>705
2バイト単位で見ていけばいいだけだろ。
基本的なロジックは変わらない。

データが奇数バイトの時にどうするか?に気をつけれよ。
0716デフォルトの名無しさん2005/05/11(水) 23:56:24
>>682
亀っぽいけど、乱数発生関数(俺も内容よくわからん)
#define MULT 25173
#define MODU 65535L
#define INCR 13849
#define FLMO 65536.0

double crand(void);
static long seed;

double crand()
{
seed = (MULT * seed +INCR ) % MODU;
return ( seed / FLMO );
}
確か図書館で借りた本(C言語Q&Aだったかな?忘れた。16bit
期の本だった。読み応えはまあまあ)にのってたやつ(だとおもう)。

整数値だけ用いるように改造してたりもしたんだが、混乱して
やめちゃって放置してた、、、偏りがないかとかも測ってない。
っていうかこれも俺が(既に)変にいじった後のものかも、、、。
0717デフォルトの名無しさん2005/05/11(水) 23:56:45
>>715
あぁ?カスがでしゃばってんじぇねぇよボケ。こっちはビットシフトしたり
2バイト確保した別の配列に入れて試したりしてんだよ低脳
0718デフォルトの名無しさん2005/05/11(水) 23:57:44
>>716
線形合同法。いまいちなやつだね。
07197052005/05/12(木) 00:17:12
あぁやっと解決した。ほんと糞の役にも立たねぇカスどもだぜ。これだけで6時間ぐらい費やしたぜ全く
0720デフォルトの名無しさん2005/05/12(木) 00:28:24
>>719
バカほど口がお達者な様で。
0721デフォルトの名無しさん2005/05/12(木) 00:31:46
豚の自演工作か?
0722デフォルトの名無しさん2005/05/12(木) 00:39:07
だまされるな!Ruby工作員に違いない!
07237052005/05/12(木) 00:41:31
カスの癖に偉そうに語って挙句の果てにちょっと煽ると工作員か。おめでてーな
0724デフォルトの名無しさん2005/05/12(木) 00:42:25
下のようなプログラムを作ったのですが、printfのところで
0xC0000005: Access Violationが出てしまいます。
VC6.0でコンパイルもうまくできるのですが、なぜこんなエラーが出てしまうのかわかりません。
どなたか教えてください。

#include<stdio.h>
#include<stdlib.h>
void AllocMem(int* a);

int main(){
    int *a;
    AllocMem(a);
    printf("%d\n",*a);
    return 0;
}

void AllocMem(int* a){
    a=(int*)malloc(sizeof(int));
    *a=10;
}
0725デフォルトの名無しさん2005/05/12(木) 00:50:32
>>724
それではAllocMem内でmallocしたアドレスは呼び出し元には返らない
0726デフォルトの名無しさん2005/05/12(木) 00:56:02
>>724
#include<stdio.h>
#include<stdlib.h>

void AllocMem(int** a);
void FreeMem(int** a);

int main(){
    int *a;
    AllocMem(&a);
    printf("%d\n",*a);
    FreeMem(&a);
    return 0;
}

void AllocMem(int** a){
    *a = (int*)malloc(sizeof(int));
    **a = 10;
}

void FreeMem(int** a){
    free(*a);
}
07277242005/05/12(木) 01:01:32
>>725>>726
ようやく理解できました。ありがとうございます!
0728デフォルトの名無しさん2005/05/12(木) 01:50:55
ファイルの中身のデータを削除するやり方がわかりません。
教えてください。

例
01,aaa,090-****-****
02,bbb,090-****-****
03,ase,02-***-***
04,afe,023-***-***

このときに3番を消したら
4が3になり、データを上書きするプログラムがわかりません。
教えてください。
データはCSV形式で保存してあります。

お願いします。
0729デフォルトの名無しさん2005/05/12(木) 01:54:22
>728
いったん別のファイルにバックアップして
元のファイルをまっさらに
バックアップから消したい行以外を書き出す
0730デフォルトの名無しさん2005/05/12(木) 01:56:49
>729
バックアップいらなくなったら忘れずに消しとけ
0731デフォルトの名無しさん2005/05/12(木) 01:56:59
>>728
system("sed -e 3d your.csv > temp; mv temp your.csv");
0732デフォルトの名無しさん2005/05/12(木) 03:05:09
0〜5 の乱数を取得するのに、
rand() % 6
として何か不都合があるのですか?
このやり方は良くないという記述を見かけたもので気になってます。
0733デフォルトの名無しさん2005/05/12(木) 03:21:13
>>732
rand()とsrand()の Linux C Library 版は random()とsrandom() のふたつの関
数 と同じ乱数生成のアルゴリズムを使用している。そのため、下位のビットは
上位のビットと同じくらいにランダムである。しかし旧版の rand() の 実 装
は、下位のビットが上位のビットほどランダムになってはいない。

Numerical Recipes in C: The Art of Scientific Computing (William H.
Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetterling; New
York: Cambridge University Press, 1992 (2nd ed., p. 277)) では、次のよ
うなコメントがなされている。
「1 と 10 の間の乱数を生成したいのであれば、常に

j=1+(int) (10.0*rand()/(RAND_MAX+1.0));

のように上位ビットを用いること。

j=1+(rand() % 10);

のような、下位のビットを用いるような方法は一切止めること。」

乱数の生成は複雑な話題である。前述の Numerical Recipes in C でも実用 的
な乱数生成を論点とした優れた議論を第 7 章(乱数)で展開している。

よ り理論的な議論については Donald E. Knuth の The Art of Computer Pro-
gramming, volume 2 (Seminumerical Algorithms), 2nd ed.; Reading, Mas-
sachusetts: Addison-Wesley Publishing Company, 1981 の第 3 章(乱数)を見
よ。これは、たくさんの実用的な話題についても深く網羅している。
0734デフォルトの名無しさん2005/05/12(木) 03:38:55
>>732
昔は不都合があることが多かった。
今でも、不都合があるシステムがあるかもしれないが、
そういう場合は大抵注意書きされてる。
0735デフォルトの名無しさん2005/05/12(木) 03:42:55
じゃあ例えばメルヘンツイスターを使ってれば、
% の剰余計算だけでも何ら不都合はないのですね?
0736デフォルトの名無しさん2005/05/12(木) 03:43:47
大抵のrandの実装は同じアルゴリズムに基づいているから、下位ビットが上位ビットよりも周期が短いのは変わらないけどね。
これがメルセンヌツイスタに変わる日が来るのだろうか。
0737デフォルトの名無しさん2005/05/12(木) 03:44:55
>>735
問題ない。
0738デフォルトの名無しさん2005/05/12(木) 09:18:17
おいおい……
rand()の値域が0-32767だと6の剰余では均等にならないだろうが。
RAND_MAXが充分大きければ目立たなくなるかもしれないが。
0739デフォルトの名無しさん2005/05/12(木) 09:58:56
重箱の隅だな
0740デフォルトの名無しさん2005/05/12(木) 12:06:18
分かり切ったことを得意げに話すバカがいるスレはここですか?
0741デフォルトの名無しさん2005/05/12(木) 12:15:15
違います
0742デフォルトの名無しさん2005/05/12(木) 12:32:17
ではどのスレですか、バカがいるのは
0743デフォルトの名無しさん2005/05/12(木) 12:42:06
Rubyスレにいっぱいいます
0744デフォルトの名無しさん2005/05/12(木) 15:03:36
>>698
コードの連続性については数字だけは言語仕様で保証されている
0745デフォルトの名無しさん2005/05/12(木) 15:12:27
BASIC の Rnd が 0 から 1 未満の浮動小数点数で値を返すのは、ユーザーに掛け算を
させることでその辺の問題をクリアするためなんじゃないかと思ってみたり。

j=1+(int) (10.0*rand()/(RAND_MAX+1.0)); とするのに何のためらいがあるんだろう。
0746デフォルトの名無しさん2005/05/12(木) 15:19:13
覚えるのが面倒くさい。
0747デフォルトの名無しさん2005/05/12(木) 15:29:04
>>745
でも、それやったところで、結局は均等にはならないよね?
どうやったら均等になるかな?
やっぱり、ダイスみたいに振り直し法を使うしかないのかな?
0748デフォルトの名無しさん2005/05/12(木) 15:30:01
完全に均等ならそれはランダムではないのでは
0749デフォルトの名無しさん2005/05/12(木) 15:34:46
重りを入れたダイスは使っちゃダメでしょ。
0750デフォルトの名無しさん2005/05/12(木) 15:39:17
>>747
10個の値がほしければ、0〜9までの配列用意して連番を入れ、シャッフルして先頭から取り出していく
それがランダムかと言われたら疑問だが。
0751デフォルトの名無しさん2005/05/12(木) 15:57:34
>>745
そこで
  double drand48(void);
ですよ。
0752デフォルトの名無しさん2005/05/12(木) 16:19:13
コンピュータでは「0〜(2の累乗-1)」以外の乱数では僅かながら偏りが出る。
そこで、例えば 0〜5 の乱数を求めるなら、
まず、0〜7 の乱数を求め、その値が 6 又は 7 だったら
その結果を捨て、再度乱数を求めればよい。
0753デフォルトの名無しさん2005/05/12(木) 19:40:15
ソフトしかわかんねー奴の限界
0754Cかなり初心者の名無し2005/05/12(木) 23:01:14
C++などはダウンロードしてやるものなんですか?
それともソフトなどを購入してやるものなんですか?
0755デフォルトの名無しさん2005/05/12(木) 23:02:33
やる とか書く奴には答えてやらない。
0756デフォルトの名無しさん2005/05/12(木) 23:04:04
やらないか
0757デフォルトの名無しさん2005/05/12(木) 23:07:30
>>754
スレ違い。C++初心者スレにでも行け。
0758デフォルトの名無しさん2005/05/12(木) 23:28:32
>>752
小数点系の乱数はそのへんクリアして内科医?
0759デフォルトの名無しさん2005/05/12(木) 23:56:33
C言語のことでお前に聞きたいが、良いですか?
0760デフォルトの名無しさん2005/05/13(金) 00:09:33
いいよ、きっとあいつが答えてくれるさ
0761デフォルトの名無しさん2005/05/13(金) 00:12:22
#line プリプロセッサの有効な使い道・使い方を
どなたかご教示ください。
0762デフォルトの名無しさん2005/05/13(金) 00:34:28
>>750
m回以上連続で同じ目が出る確率が低くなり、
n回以上連続で同じ目が出る確率が0に、、、
というふうになるの?

どう違うか計算しようかと思ったが今の俺の頭で
は無理そうだな。

無視できる程度の違いだとも思えるけど、
0763ヽ(´ー`)ノ ◆.ogCuANUcE 2005/05/13(金) 00:51:46
>>761
例えば、何かしらの方法で C のソースを生成する時とか。
-- hello.c.tmpl
printf("hello world\n");

から
-- hello.c
#include <stdio.h>

int main() {
printf("hello world\n");
return 0;
}

なソースを生成する時に、
-- hello.c
#include <stdio.h>

int main() {
#line "hello.c.tmpl" 1
printf("hello world\n");
#line "hello.c" 7
return 0;
}

とかやると、人間の可読性は落ちるけど、C のソースをコンパイルした時に
元となった hello.c.tmpl のどこで間違ってるか分かるわな。

普通に C でコード書いてる分にはあまりお世話にならんね。
cpp の結果で出てくるぐらいじゃないかな。
0764デフォルトの名無しさん2005/05/13(金) 02:03:35
>>763
親切
0765デフォルトの名無しさん2005/05/13(金) 02:50:51
計算が苦手な>>661です 質問文を書きなおしますね

unsigned char に置き換えて考えると
unsigned char u1 = 0x05, u2 = 0xFF;

u1 + u2 これは 5 + 255 = 260
CHAR_MAX が 255 なので 260 % (255 + 1) で 4 (0x04) ですよね

では, u1 - u2 つまり 0x05 - 0xFF をどう計算すると 0x06 になるのか
が直感的に分からないのです

>>665 (ちょっと変えています)
>0xffを引くことは即ち-1を引くこと。
まさにここがよく分かりません
これは signed の計算方法ではないのですか?

0766デフォルトの名無しさん2005/05/13(金) 03:19:17
筆算をしてみると(面倒なので 4+1bitで計算)、

0 0101 = 5
0 1111 = F
--------------
1 0110

となって、答えは1 0110。
ただし、4bit分しか表現できないので、最上位ビットの1が消えて
0110 = 6
が計算結果となる。
0767デフォルトの名無しさん2005/05/13(金) 03:24:08
>>765
まずunsignedで0x05-0x06をやってみて、次に0x05-0x07、0x05-0x08・・・としていくと0x05-0xFFがどうなるか想像つかない?
0768デフォルトの名無しさん2005/05/13(金) 08:10:19
printf("%u", (unsigned char)-250);
0769デフォルトの名無しさん2005/05/13(金) 08:13:08
>>765
2の補数で数直線を書いてみるといいよ
0770デフォルトの名無しさん2005/05/13(金) 08:23:45
オーバーフローしたことを知る方法はありますか?
0771デフォルトの名無しさん2005/05/13(金) 09:09:50
>>770
アセンブラならCPUによってはそういうのを知らせるフラグなんかがあるからそれを見ればいいんだろうけど
C言語だとそんなの聞いたこと無いしなぁ・・・
0772デフォルトの名無しさん2005/05/13(金) 09:40:13
CPUによっては、、、って
無いCPUもあるの?
0773デフォルトの名無しさん2005/05/13(金) 09:45:33
>>772
知らないけどあったら嫌だから念のためw
0774770だけど2005/05/13(金) 10:30:52
正 + 正 で負になる。
負 + 負 で正になる。
で正解ですか?
0775デフォルトの名無しさん2005/05/13(金) 10:41:45
#include <stdio.h>
main()
{
       int c, i, nwhite, nother;int ndigit[10];nwhite = nother =0;
for (i = 0; i < 10; ++i) ndigit[i] =0;

while ((c = getchar()) != EOF) {
if (c >= '0' && c <= '9') ++ndigit[c-'0'];
else if (c == ' ' || c == '\n' || c == '\t') ++nwhite;
else ++nother;
}
printf("digits =");
for (i = 0; i < 10; ++i) printf(" %d, ", ndigit[i]);
printf("white space =%d, other = %d\n", nwhite, nother);
}

K&Rにある入力した文字を、数字、空白文字、
その他に分けてそれぞれをカウントするプログラムなのですが、
if (c >= '0' && c <= '9') の部分で数字あるかどうか判定し、
++ndigit[c-'0'];のc - '0'でその数値を求めると説明にありますが、
いまいちよく飲み込めません。

if (c >= '0' && c <= '9')は「文字コード49以上かつ57以下であれば」を示すのでしょうか?
c - '0'はサッパリ分かりません。
どなたか宜しく御願いします。
0776デフォルトの名無しさん2005/05/13(金) 10:47:26
cが '0' のとき、 c - '0' は 0 になるわけだ
cが '9' のとき、 c - '9' は 9 になるわけだ
0777デフォルトの名無しさん2005/05/13(金) 10:47:51
cが '9' のとき、 c - '0' は 9 になるわけだ

だった・・・
0778デフォルトの名無しさん2005/05/13(金) 10:52:55
>>774
C言語以外、たとえば人間関係とかなら正解
0779デフォルトの名無しさん2005/05/13(金) 11:41:39
C言語の基礎はわかるようになったんですけど
ブロックくずしなどのゲームを作れるようになりたいのですが
どうしたらよいでしょうか?
オススメの参考書や学習セットみたいなのがあるのならば
教えていただきたいです。

宜しくお願いします。
0780デフォルトの名無しさん2005/05/13(金) 12:30:11
>>779
>>1 も読めないような奴には教えられない。
0781デフォルトの名無しさん2005/05/13(金) 12:39:58
>>779
スレ違い
0782デフォルトの名無しさん2005/05/13(金) 12:41:19
>>781
そうか?
0783デフォルトの名無しさん2005/05/13(金) 12:45:13
>>782
どうしたらいいかを決定するのは>>779だし、
参考書などの紹介をするスレでもない。
Cに関わる質問も出ていない。


どこに、このスレに該当する項目がある?
0784デフォルトの名無しさん2005/05/13(金) 12:50:09
というより>>779=>>782なんだろうよ
0785デフォルトの名無しさん2005/05/13(金) 12:52:01
Cでブロック崩しを作るにはっていう質問じゃないの?
確かにCと指定はしてないんで、rubyで作ろうとしてるのかもしれないけど。
0786デフォルトの名無しさん2005/05/13(金) 12:55:15
virtual継承されたくないクラスがあるのですが、
基底クラスからそれを禁止する方法ってないものでしょうか。

コメントに書いておけばいいのかな…。
0787デフォルトの名無しさん2005/05/13(金) 12:58:07
いい参考書や学習セットが欲しいんだろ?
だから推薦図書スレでも言ってそこで聞けやボケってことだろ?
なんで理解できないの?
0788デフォルトの名無しさん2005/05/13(金) 13:00:02
>>786
スレ違い
0789デフォルトの名無しさん2005/05/13(金) 13:54:39
C言語なら俺に聞け!
0790デフォルトの名無しさん2005/05/13(金) 13:57:44
失礼しました、C++相談所行ってきます…。
0791デフォルトの名無しさん2005/05/13(金) 14:11:53
#include <stdio.h>]
#define IN 1
#define OUT 0

main()
{
char c; int i, state; int na, nn[19], nm[19];
na = i = 0;

while ((c = getchar()) != EOF) {
if (c == ' ' || c == '\t' || c == '\n')state = OUT;
else state = IN;

if (state == IN) na++;
else if (state == OUT) {(nn[na])++ ; na = 0;}
}
printf("単語の文字数 度数 累積度数 累積比率\n");
for (i=0; i>=19; i++) nm[i] = nm[i] + nn[i];

i=1;
while (i>=19) {
printf("%d %d %d %3.2f\n", i, nn[i], nm[i], nn[i]/nm[19]);
i++;
}
return 0;
}

一度目のwhileループ後がうまく動きません。
修正箇所ありましたら教えてください
0792デフォルトの名無しさん2005/05/13(金) 14:15:20
どっから動かないのかはよく見てないけど

i=1;
while (i>=19)

これは whike 素通りするよな
0793デフォルトの名無しさん2005/05/13(金) 14:19:41
>792
ほんとだ…その点も含めて軽く修正してみました

#include <stdio.h>
#define IN 1
#define OUT 0

main()
{
char c; int i = 0, state; int na, nn[19], nm[19];
while (i<=19){
nn[i] = 0; nm[i] = 0;
i++;
}
na = i = 0;
while ((c = getchar()) != EOF) {
if (c == ' ' || c == '\t' || c == '\n')state = OUT;
else state = IN;

if (state == IN) na++;
else if (state == OUT) {(nn[na])++ ; na = 0;}

}
printf("単語の文字数 度数 累積度数 累積比率\n");
for (i=0; i<=19; i++) nm[i] = nm[i] + nn[i];

i=1;
while (i<=19) {
printf("%d %d %d %3.2f\n", i, nn[i], nm[i], nn[i]/nm[19]); i++;
}
return 0;
}
0794デフォルトの名無しさん2005/05/13(金) 14:21:58
>>793
0から19って要素数いくつあるよ
nn[19], nm[19]; は、0から18までの19個しか使えないぞ
07957912005/05/13(金) 14:36:58
解決しました
ありがとうございました
0796デフォルトの名無しさん2005/05/13(金) 14:40:45
>>794
>>793の意図している事は、19個使う事かもしれない
>i=1;
>while (i<=19) {
他の所が間違えてる可能性もあり
0797デフォルトの名無しさん2005/05/13(金) 14:42:20
以下の英文をファイルとして読み込み,以下の規則に従って単語を変換した後, 別ファ
イルに出力するプログラムを作成せよ.
(規則1):5文字以上の単語を全て大文字にする.
(規則2):"the"という単語を()で囲む(The -> (The))
A color scheme is one of the important elements when considering a design of
Web contents such as illustrations. However, since the explicit rule which
determines a color scheme does not exist, the inexperienced user has to proceed
the design work by repeating trial and error.

初心者な俺には超分かりません どうすりゃいいんですか?
0798デフォルトの名無しさん2005/05/13(金) 14:51:26
ピリオド、カンマ、空白、改行文字まで読み込んで、
それが五文字以上だったら大文字で、未満ならそのまま出力、
をファイル終端まで繰り返す。
theは文章のままだな
0799デフォルトの名無しさん2005/05/13(金) 15:38:46
自己満足しました。
ありがとうございました。
0800デフォルトの名無しさん2005/05/13(金) 15:45:35
自己満かよ
0801デフォルトの名無しさん2005/05/13(金) 15:46:22
>>797
Cではなく、sed, perlの方が楽かも知れない
0802デフォルトの名無しさん2005/05/13(金) 15:55:14
こんにちは。画像処理をしてるんですけど、ある点を指定して、そこのまわりの画素を順に調べていき、
(指定した点の画素の画素値)/2より大きければ白、小さければ黒にして、一度黒が出た時点でそこ以降の周りは、全部黒にしたいんですけど下のプログラムではできません><。訂正お願いします。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define USAGE "usage: program input-filename width height output-filename\n "
#define x 258 /*目的位置を入力(x)*/
#define y 213 /*目的位置を入力(y)*/

void tra4(unsigned char *in, unsigned char *out, int width, int height)
{int i; int j; int h; int k,l,m,n;k = x-1;
l = x+1;m = y-1;n = y+1;
out[(y-1)*width+x] = 255;
/*第2象限k*/
for(i=0;i<k;i++){
for(j=0;j<y;j++)
{
if ((in[(y-1)*width+x])/2 < in[(y-j-1)*width+(k-i)] )
{
out[(y-j)*width+(k-i)] = 255;
}
else
{
for(h=0;h<(y-j-1);h++)
{
out[(y-j-h-1)*width+(k-i)] = 0;
}}}}
一部を書きました
0803デフォルトの名無しさんNGNG
全部書けよボケ・・・
0804デフォルトの名無しさん2005/05/13(金) 17:01:47
char型の数字はどうすればint型の数値になおせますか?
0805デフォルトの名無しさん2005/05/13(金) 17:03:31
int型にキャストするか、int型の変数に代入する
0806デフォルトの名無しさん2005/05/13(金) 17:03:33
>>804
'0'を引く。
0807デフォルトの名無しさん2005/05/13(金) 17:06:49
>>804
変換したい元のcharの内容による。
5→5なら>>805
'5'→5なら>>806
08088042005/05/13(金) 17:10:55
わかりました。
ありがとうございました
0809デフォルトの名無しさん2005/05/13(金) 17:13:09
どっちの意味だったんだろ
08108052005/05/13(金) 17:24:00
俺は「もっと日本語をしっかり書け」という意味を込めたのだが。

つーか、この内容を質問する奴はいないだろ。
0811デフォルトの名無しさん2005/05/13(金) 17:39:59
>>807,809
数字 ≠ 数値

数「字」
0812デフォルトの名無しさん2005/05/13(金) 17:41:05
>>811
んじゃ>>806の方だな
0813デフォルトの名無しさん2005/05/13(金) 22:17:50
キーボードからの入力をリアルタイムで使いたいのです。
Enterを押す必要がなく、あるキーを押した瞬間にその値を使うことはCで可能ですか?
できればその方法がしりたいです。
0814デフォルトの名無しさん2005/05/13(金) 22:24:25
>>813
プラットフォームによるンじゃないか?
0815デフォルトの名無しさん2005/05/13(金) 22:41:54
>>813 標準Cでは無理
各処理系の板なりスレなりへGo!
0816デフォルトの名無しさん2005/05/13(金) 22:48:28
switchを使った条件分岐ってif-else ifを使った時より
遅いんですか?
0817デフォルトの名無しさん2005/05/13(金) 22:49:35
>>816 スレ違い
本当に速さが必要ならアセンブラでもやってろ
0818デフォルトの名無しさん2005/05/13(金) 23:51:58
スレ違い厨が出て来ました。w
自分が答えられないから何でもスレ違いと決め付ける厨房です。
0819デフォルトの名無しさん2005/05/14(土) 00:00:02
ここは2ちゃんねるですよ。思い上がった知識とうぬぼれた技術をひけらかして
自慢するスレに何を期待しているんですかぁ?
0820デフォルトの名無しさん2005/05/14(土) 00:01:00
>>819
だれも"お前の"2chを見たいわけじゃない。
0821デフォルトの名無しさん2005/05/14(土) 00:07:19
速度の意識が C と無関係であると言い切っている >>817 は自分こそスレ違いであることを認識できていない
0822デフォルトの名無しさん2005/05/14(土) 00:32:16
>>816
標準Cではそんなことは決められていない。
0823デフォルトの名無しさん2005/05/14(土) 00:35:10
「どーせ最適化」で始まる馬鹿発言のジェネレータ
0824デフォルトの名無しさん2005/05/14(土) 01:49:54
fopen()のopen()違いって何なんでしょうか?
高水準ファイル出力と低水準ファイル出力の違いが今ひとつ分からない…
0825デフォルトの名無しさん2005/05/14(土) 02:01:11
>>824
と?
0826デフォルトの名無しさん2005/05/14(土) 02:06:09
>>824
お前には全く関係ない話だから fopen() だけを使え。
0827デフォルトの名無しさん2005/05/14(土) 02:07:38
ファイルを開いて
呪文言って
バトルして
0828デフォルトの名無しさん2005/05/14(土) 02:08:12
fopenはANSI準拠の環境で利用でき、openはPOSIX準拠の環境で利用できる。
大まかな傾向を言うと、ANSIのファイル入出力はテキスト志向が強く、
POSIXのファイル入出力は細かな動作指定が可能。
0829デフォルトの名無しさん2005/05/14(土) 02:13:19
UNIX系ならread,writeをソケットに対して使えるのとのと、あといわゆるスレッドセーフってやつ。
0830デフォルトの名無しさん2005/05/14(土) 04:51:14
fork() 関数で子プロセスを生成しました。
親プロセスは、一秒に一回ぐらいの間隔で、子プロセスが終了してるかどうかを確認したいのです。
その間、親では

while(1){
子プロセスの終了してるか監視 終了してれば、処理を抜ける
メータ表示
}
などのプログラムを動かしたいと思っています。


いろいろ調べたんですがwait()関数なるものが子プロセス終了まで待ちつづけるというものでしたので、子プロセスが動いている間
メータを動かすという処理が出来ませんでした。

子プロセスは、system関数で、別のプログラムを実行しています。
その間、親プロセスで、メータを増やす処理をしたいのですが、子プロセスが終了?してるか調べるwait関数に変わるものは何かあるのでしょうか?

ps -aux で確認したところ、子プロセスの処理が終わったらゾンビプロセスになってました;


0831デフォルトの名無しさん2005/05/14(土) 05:04:47
スレ違い
08328302005/05/14(土) 06:00:03
>831

スレ違い申し訳ありません;

LINUX板かUNIX板で聞いたほうがよろしいでしょうか?
GCCでコンパイルしてるんですが・・
0833デフォルトの名無しさん2005/05/14(土) 06:16:06
板違いじゃなくてスレ違い
>>1の1行目を100回読め
0834デフォルトの名無しさん2005/05/14(土) 06:38:44
>833
UNIXプログラミング質問すれってのがありました
ありがとうございます
0835デフォルトの名無しさん2005/05/14(土) 13:09:13
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
0836デフォルトの名無しさん2005/05/14(土) 13:31:10
ビットをシフトしたい時。
0837デフォルトの名無しさん2005/05/14(土) 14:51:28
与えられた整数を二進数で表示するとき
0838長文ごめんなさい2005/05/14(土) 15:49:30
main()
{
int i = 1 ;

for ( printf("hoge\n") ; i > printf("aaa"),5 ; i++ )
printf("fuga") ;

return 0 ;
}

for文の評価順序について確認しようと、テストプログラムを作っていました。

この場合、無限ループに陥ってしまうのはなぜですか?
()で括ると正常に動くあたり、優先順位の関係には思えない気もしますし。
printf("aaa"),5 で5が評価対象となったとしても、無限ループに
なる訳がないし、と悩んでおります。

あと、評価順序は、for(1;2;3) で間違えないですか?
大抵の本には、 for(2;1;3)のような記述が書かれているように思うのですが、
評価順序も規格とかで決まっているものなのでしょうか。
0839デフォルトの名無しさん2005/05/14(土) 16:00:42
,(カンマ)の優先順位は考慮したか?
0840デフォルトの名無しさん2005/05/14(土) 16:02:59
げ・・・ > より , が優先順位が低くて、最後に5が残るのですか・・・
スレ汚しすみませんでした。;;
0841デフォルトの名無しさん2005/05/14(土) 16:15:37
>>840
どーせやるなら
for(printf("1"), i = 1; printf("2"), i < 5; printf("3"), i++) printf("4");
だろ
順序については、http://www.jisc.go.jp/app/pager?id=13508 で 6.8.5.3 を読めばはっきりする
0842デフォルトの名無しさん2005/05/14(土) 16:24:48
Cをマスターした後は何にチャレンジするのがベストですか?
0843デフォルトの名無しさん2005/05/14(土) 16:26:19
>>841
ほんとだ! おかげさまで、はっきりと致しました。
ありがとうございます。
0844デフォルトの名無しさん2005/05/14(土) 16:28:21
>>842
VB
0845デフォルトの名無しさん2005/05/14(土) 16:28:57
>>842
簿記
0846デフォルトの名無しさん2005/05/14(土) 16:31:23
>>842
アセンブラ
0847デフォルトの名無しさん2005/05/14(土) 16:33:05
>>843
http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3010
0848デフォルトの名無しさん2005/05/14(土) 16:37:28
ttp://i218-47-78-119.s01.a014.ap.plala.or.jp/
おkwwwwwwwwwwwwうはっwwwwwwwww
wwwwwwうぇうぇうはっwwwwwwwwwwww
うぇうぇうはっwwwwwwおkwwwwwwwwwwww
うぇうぇwwwおkおkっうぇwwwwwwwwwwwwwww
08498422005/05/14(土) 16:39:42

    f`::'ー 、,-、-、_ _,....-- 、_  _,....-=―ヽ―-、-、_        、ミ川川川彡
   ,.r'‐'゙´ヽ,r'  ヽ \ー、_:::::::::/,´:::::::::::,:::::::,::::::::ヽ::\`ー、     ミ       彡
 ,〃ィ  ,rヽ'-ヽ i 、 、 ヾ,、 `'y',ィ´/::::::::/|::::::ハ_::::::::ト、::::\ \  三  ギ  そ  三
r'/〃//    | i! |, \、_`ー!rf.,イ-,ィ/u ノ::::/ |::::`::::|iヽ::::::ヽ  ヽ. 三   ャ れ  三
iヾ!l i /,.=ヽ  i,ケ ハ,i', Y't=ラ゙,〉'|::::r'|! 彡´ ,!--、 |i!|::|::i::::::',   ', 三  グ  は  三
  {ヾllッ-,   〃ノ'-'、||ii i|i| |-/! /^ヽ    ´   ヾ|从ノ::i::::|   ||三  で     三
  >|゙! 0ヽ ノ' ´ 0 レノWノi |,.、!/ 0       0  ',' レ|,イ::::i,,_ | !三  言  ひ  三
  ',i ヽ- ,      _, "  |i| | |             ´ '´ハ',Y  .!三  っ  ょ 三
  /l   `        !| | i `´ r     'ー‐' u   (-, ' |   !三  て  っ  三
  /久        U  |! i|'´'、u              z_,ノ/ .i |三  る  と  三
 /イ |ヽ '==..‐_、      |!,'|Y´,ヽ  ___        ハ_ ,/i | |三  の  し 三
 |ト|、',::::\     _,.-‐イ//-'´::::!\'ー‐--ニュ     / ト_、 _| _!,=,|三  か て 三
  〉:ヾ_'、::::`ー‐r<   //イ|::::::_、:::`7i\ __,..-‐'´  .| |`゙"::"::|-"三  !?    三
 'ー‐'´¨`'ー、/,rケ  /,'1ノ人'-‐'`y'/::::, i| ,!,      |`iiイ:::::::::|  彡     三
    ,〃7,‐/ {   ´_,-'´ ,,‐!、=,/.〃::::i i|kハ    / ,ヾ、::::::|.|!  彡川川川ミ
   ,ッ'、_〃'f /゙-<´  r〃 〃 /イ::::,!ッ'/  ',  / /   |ト、:|:リ
  rir' 〃,y'、久_,.rヽ/〃  川/iケir'〃/ ,-'水´  /    〃  \
  f::}'ー'〃_i| /::::f|::::',  .〃 r/if |||ir' f| レ' r'o | .〃-、 〃     "i
  ,);'ーッ゙-. レ:::::/_|::::::',_,〃=_、!!|| !i/ ||:,ri   !o ∨/_)_〃        |
0850デフォルトの名無しさん2005/05/14(土) 17:28:36
急速にスレの質が低下してまいりました
0851デフォルトの名無しさん2005/05/14(土) 19:51:36
質問です。
文字列を返す時にstrlenで返そうとすると、
空白やタブ等、文字以外の物を返してくるのですが、
文字だけ返す方法はあるのでしょうか?
また、strlen以外で違うやり方はあるのでしょうか?
よろしくお願いします。
0852デフォルトの名無しさん2005/05/14(土) 19:55:21
>>851
はい?なんですか?
信じられないという気持ちが目を見えなくしているようです。
0853デフォルトの名無しさん2005/05/14(土) 19:57:52
手強すぎ
ちょっと手に負えない
0854デフォルトの名無しさん2005/05/14(土) 20:01:41

E S P 発 動
08558512005/05/14(土) 20:04:25
すみません。質問が悪かったです。
標準入力からの入力の行数、文字数を数えたいのですが、
その時に、文字数には空白をカウントしたくないのですが、
どうすればいいのですか?
0856デフォルトの名無しさん2005/05/14(土) 20:06:55
>>851
これ使ってみる?
#include <ctype.h>
size_t printable_len(const char *p) {
    size_t len = 0;
    while (*p++) if (isprint(*p)) len++;
    return len;
}
08578512005/05/14(土) 20:10:31
>>856
ありがとうございます。
しかし、それ難しいですね。
基礎だけでできるやり方などはございますか?
0858デフォルトの名無しさん2005/05/14(土) 20:17:33
ワロタ
0859デフォルトの名無しさん2005/05/14(土) 20:22:57
俺はまた失明しそうになった。
0860デフォルトの名無しさん2005/05/14(土) 20:25:21
ネタなのか?
ねたなのか?
ねたnのか?
ntnnk?
0861デフォルトの名無しさん2005/05/14(土) 20:35:11
>>857
>基礎だけでできるやり方などはございますか?

無理に >>856 のソースの意味を理解しようとせず、
そのままコピーして使うだけにする。
08628512005/05/14(土) 20:47:04
ネタじゃないです。
大学で習ってないものを使ってやっても、
提出を認められないので、基礎的なやり方に絞ってました。

>>861
さっきからやってみてたんですが、
やっぱり分からなかったです。

ありがとうございました。
0863デフォルトの名無しさん2005/05/14(土) 20:57:23
isprint じゃ漢字が入ってた場合にだめだろ。
0864デフォルトの名無しさん2005/05/14(土) 21:04:39
アスキー限定でもだめでつ
0865デフォルトの名無しさん2005/05/14(土) 21:11:03
さて、もう遅いので釣りをやめて帰るとするか・・・
0866デフォルトの名無しさん2005/05/14(土) 21:16:00
isgraph()
0867デフォルトの名無しさん2005/05/14(土) 21:24:53
DQNな大学だな
0868デフォルトの名無しさん2005/05/14(土) 21:30:30
普通そういうレベルの話なら授業1日目で終わるんだが。
08698562005/05/14(土) 21:45:16
>>866
間違った
0870デフォルトの名無しさん2005/05/14(土) 22:11:23
>>857
やり直し。でもやっぱりマルチバイト文字はダメ。
#include <ctype.h>
size_t graph_len(const char *p) {
    size_t len = 0;
    while (*p) {
        if (isgraph(*p)) len++;
        p++;
    }
    return len;
}
0871デフォルトの名無しさん2005/05/14(土) 22:18:45
マルチバイト文字に対応しようと思ったら、wchar_t* に変換して、
iswgraph() 使えばいいの?
0872デフォルトの名無しさん2005/05/14(土) 22:29:41
そうだタカヤ
0873デフォルトの名無しさん2005/05/14(土) 23:16:34
これでいいの? なんかむぢかちぃ

#include <wchar.h>
#include <stdio.h>
#include <wctype.h>
#include <locale.h>

int main(void)
{
wchar_t wc;
int wc_count = 0;
int line_count = 0;

setlocale(LC_CTYPE, "");
while (wc = getwchar(), wc != WEOF) {
if (iswgraph(wc)) {
wc_count++;
}
if (wc == L'\n') {
line_count++;
}
}

printf("字数:%d 行数:%d\n", wc_count, line_count);

return 0;
}
0874デフォルトの名無しさん2005/05/14(土) 23:38:45
っていうか素直に空白文字をカウントしないほうが早い希ガス
0875デフォルトの名無しさん2005/05/14(土) 23:43:57
iswgraphが!iswspaceに変わるだけだと思うが・・・。
0876デフォルトの名無しさん2005/05/14(土) 23:48:26
>>875
それだと空白文字が出てきた時点でカウントをやめてしまうんじゃないか?
0877デフォルトの名無しさん2005/05/15(日) 00:36:32
え、どゆこと? 空白文字以外が出てきた時点でカウント再開すると思うけど。

iswgraphを!iswspaceに変更して実行してみたら↓

sc011% a.out
875 :デフォルトの名無しさん :2005/05/14(土) 23:43:57
iswgraphが!iswspaceに変わるだけだと思うが・・・。
字数:70 行数:2

で計算合ってるし。
0878デフォルトの名無しさん2005/05/15(日) 01:05:44
>>877
勘違いスマソ
0879デフォルトの名無しさん2005/05/15(日) 05:54:31
(int)((float)rand()*N / (float)(RAND_MAX+1))
これって float にする意味あるのか?
全く意味無いんじゃないの?
rand()*N / (RAND_MAX+1)
これとどう違うの? 何のために浮動小数点型にするの?
不動小数点型でやった方が良くない?
0880デフォルトの名無しさん2005/05/15(日) 07:24:27
大して気にする必要なし
0881デフォルトの名無しさん2005/05/15(日) 07:31:54
RAND_MAXの最小値は規定されているが
最大値は規定されていない
0882デフォルトの名無しさん2005/05/15(日) 08:50:51
処理系によってはぼけなコードになるな
(float)(INT_MAX + 1)
0883デフォルトの名無しさん2005/05/15(日) 12:36:41
Cを単体で使うと、直接CPUを制御できるんですか?
0884デフォルトの名無しさん2005/05/15(日) 12:42:19
できるよ
0885デフォルトの名無しさん2005/05/15(日) 12:42:39
できないよ
0886デフォルトの名無しさん2005/05/15(日) 13:10:26
できるときもあるよ
0887デフォルトの名無しさん2005/05/15(日) 13:45:16
ばあいによってはできないかのうせいもなくはないよ
0888デフォルトの名無しさん2005/05/15(日) 13:55:58
無責任な生き方こそ長生きのコツ
0889デフォルトの名無しさん2005/05/15(日) 14:44:43
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
0890デフォルトの名無しさん2005/05/15(日) 14:48:35
ビットシフトのありがたみがわからない奴には天誅を加えてやる
0891デフォルトの名無しさん2005/05/15(日) 15:23:43
つうかビットシフトの質問は釣り
0892デフォルトの名無しさん2005/05/15(日) 16:28:05
>>889
楽しいか?
0893デフォルトの名無しさん2005/05/15(日) 16:30:25
ビットシフトのおかげで、宝くじに当たったり彼女が出来ました!

               東京都 男性・24歳
0894デフォルトの名無しさん2005/05/15(日) 17:20:35
BCC5.5でC言語を勉強中です。
Windowsのコマンドプロンプトの環境では図形を描いたり
色を付けたりできないのでしょうか。
0895デフォルトの名無しさん2005/05/15(日) 17:28:54
文字の色付け程度なら
0896デフォルトの名無しさん2005/05/15(日) 17:41:03
16進数の数字文字列を整数に変換するような関数とかってないですか?
0897デフォルトの名無しさん2005/05/15(日) 17:46:58
ないです
0898デフォルトの名無しさん2005/05/15(日) 17:49:40
sscanfでもええやん
0899デフォルトの名無しさん2005/05/15(日) 17:59:17
>>897
嘘つくな

>>896
strtol
0900デフォルトの名無しさん2005/05/15(日) 18:03:03
>>889
その質問は、「なぜソフトで実現するのか」ということの核心をついている
しゃっきり答えられない香具師は砂上の楼閣
0901デフォルトの名無しさん2005/05/15(日) 18:23:25
>>900
おま%k腋ヌ2の回答は?
09029012005/05/15(日) 18:23:53
化けた_| ̄|○
0903デフォルトの名無しさん2005/05/15(日) 19:34:07
>>901
>おま%k腋ヌ2

なんかエロイな
0904デフォルトの名無しさん2005/05/15(日) 19:36:05
>>903
どうせ
おま と 液 に反応しただけでしょ!変態!
0905デフォルトの名無しさん2005/05/15(日) 20:39:14
腋臭
0906デフォルトの名無しさん2005/05/15(日) 20:40:20
>>894
スクリーンに書き込むのはできる
0907デフォルトの名無しさん2005/05/15(日) 20:53:35
XPならコンバイラ不要?
0908デフォルトの名無しさん2005/05/15(日) 20:54:14
>>907
すいません、XPのOSが入っていればCのコンバイラは不要ですか?
0909デフォルトの名無しさん2005/05/15(日) 20:55:48
はい?
0910デフォルトの名無しさん2005/05/15(日) 20:58:03
普通の人には必要ないでしょ。
0911デフォルトの名無しさん2005/05/15(日) 21:02:52
>>910
どういう意味ですか?
0912デフォルトの名無しさん2005/05/15(日) 21:05:30
>>911
質問の意味がわかりません
0913デフォルトの名無しさん2005/05/15(日) 21:13:05
>>912
すいません、混乱してました、

変な事言ってすみませんでした
0914デフォルトの名無しさん2005/05/15(日) 21:32:17
農家の人なのかな?
0915デフォルトの名無しさん2005/05/15(日) 21:33:13
>>900
>>891
0916デフォルトの名無しさん2005/05/15(日) 21:33:16
はい?
0917デフォルトの名無しさん2005/05/15(日) 22:01:33
コンパイラだった_○/|_
0918デフォルトの名無しさん2005/05/15(日) 22:19:08
>>907
>>1-2のリンク先を熟読しておいで
それでもわからないなら色んなものを諦めろ
0919デフォルトの名無しさん2005/05/15(日) 22:37:13
>>918
待て、奴はコンパイラとは言ってないぞ
09209182005/05/15(日) 23:04:24
>>919
>>917で訂正してるから流してやっていただきたい

俺を、な
0921デフォルトの名無しさん2005/05/16(月) 04:13:28
>>892
楽しいよ
食いつきいいんだもん
0922デフォルトの名無しさん2005/05/16(月) 11:54:57
突然で申し訳ないですが、
回文判定部分を,文字列を受け取るとその文字列が回文なら 1 を、
そうでないなら 0 を返す関数を設計し,置き換える。
という風にしたいんですが、以下のやつからどうしたらいいんでしょうか?
詳しい方どうか教えてくださいませ。
#include <stdio.h>
#define MAX 100

main()
{
char string[MAX];
int n, i;

/* input */
printf("string = ");
scanf("%s", string);

/* strlen */
for (n = 0; string[n] != 0; n++) {
/* 何もしない */
}

/* reverse */
for (i = n - 1; i >= 0; i--)
putchar(string[i]);

putchar('\n');
}
0923デフォルトの名無しさん2005/05/16(月) 13:00:05
で、その回文判定部分ってどこ?
0924デフォルトの名無しさん2005/05/16(月) 13:19:46
K&Rのアンサーブック持ってる方、演習1-16を説明シテクダサイ
問題の意味がまったくワカラネ
0925デフォルトの名無しさん2005/05/16(月) 13:30:10
>>924
持ってないのでパス
0926デフォルトの名無しさん2005/05/16(月) 13:38:12
K&R アンサーブックは漏れも持ってない。
ただの K&R でよければ、

| 一番長い行を印字するプログラムの main ルーチンを書き直して、任意の長さの入力行群
| の長さ、およびテキストのできるだけ多くの部分を正しく印字できるようにせよ。

確かにわかりづらい (一応わかるけど)
0927デフォルトの名無しさん2005/05/16(月) 16:09:32
>>924
ガンパレ。そこ以降もヘタクソな日本語による出題が続出だ。
0928デフォルトの名無しさん2005/05/16(月) 16:44:52
>>926
流し読みした感じでは、
「一番長い行を印字するプログラム」では、行の長さに制限がある
だから制限を取り除け。
という意味に読めた。

ちゃんと読んでみると、、、、全然わからん orz
0929デフォルトの名無しさん2005/05/16(月) 16:50:05
行の長さに制限があるから、その範囲内に収まるように短くしろってこってしょ。
09309242005/05/16(月) 17:41:33
とりあえず飛ばすことにしました…

ほんと意味ワカラネ日本語ばっかで、字面を追うのだけでも苦労シテオマス

こういうものなんだ、と思い込んでがんばります。レスくれた方ありが�d
0931デフォルトの名無しさん2005/05/17(火) 00:28:51
Visual C++ Express Edition Beta 2 日本語版ってフリーソフトですか?
0932デフォルトの名無しさん2005/05/17(火) 00:58:27
ツマンネ
0933デフォルトの名無しさん2005/05/17(火) 01:33:49
これは某大学で出た課題なんだが、みなさんだったらこの問題をどう解きますか?

0から9までの数字を使って5桁の整数を2つ作って、それを掛け合わせた結果も
0から9までの数字が1回ずつ出てくる10桁の数になるような組み合わせの数を求める。

12345*67890 とか。01234は4桁だからだめ。再帰を使って解く問題だと思ったんだが
教官が配ったプログラム例では総当りっぽく計算してたかな。
09349332005/05/17(火) 01:34:48
訂正

> 0から9までの数字を使って
0から9までの数字を「1回ずつ」使って
0935デフォルトの名無しさん2005/05/17(火) 02:07:13
総当りでいかに回数を減らすか、じゃないか
なんで再帰が出てくるのかわからん
0936デフォルトの名無しさん2005/05/17(火) 02:24:52
宿題は(ry
0937デフォルトの名無しさん2005/05/17(火) 02:32:18
100個くらいに分割して、それぞれのコンピュータで計算かな。
学校だったらそれくらいのコンピュータはあるだろうし。
0938デフォルトの名無しさん2005/05/17(火) 02:44:19
>>936
解いて欲しいということじゃなくて、どんな計算法があるのかなと思って。

>>935
0〜9を1回ずつ組み合わせてできる5桁の数×2を再帰で作れば速いかなと思ったの。

ちなみに俺が書いてみたソース。もしよければ評価してください。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/399.txt
0939デフォルトの名無しさん2005/05/17(火) 08:19:58
よくないから評価しない。
0940デフォルトの名無しさん2005/05/17(火) 10:24:39
枝刈り、全然やってねぇじゃん。
0941デフォルトの名無しさん2005/05/17(火) 10:44:25
枝刈ると分からない人が出てくるから
0942デフォルトの名無しさん2005/05/17(火) 11:47:53
エッジ抽出の縦方向と横方向を合成するプログラムは
どうすればいいのですか?

ソースうpしてください。m(__)m
0943デフォルトの名無しさん2005/05/17(火) 12:08:05
>>942
>>1
> ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
0944デフォルトの名無しさん2005/05/17(火) 13:00:22
縦と横を足して二で割ればいいんじゃないの?
0945デフォルトの名無しさん2005/05/17(火) 13:03:09
質問させてください。
引数を2つ受け取ってそれをメンバにした構造体を宣言して、
それを返すっていう関数を作りたいのですが
その関数を抜けてもその構造体が保持されて、
再びその関数を実行したときに、前とその時の構造体が別々に
保存されるようにするにはどのようにすればいいでしょうか?
0946デフォルトの名無しさん2005/05/17(火) 13:11:13
>>945
激しく意味がわからん
0947デフォルトの名無しさん2005/05/17(火) 13:13:57
>>945
日本語で話せ
0948デフォルトの名無しさん2005/05/17(火) 13:17:49
やっぱ伝わらんかったかorz
えーとやりたいことはこんな感じなんですけど、
これだと二回以上この関数を実行したときに
前に宣言したtestの内容が消えちゃうんで
別々に保存するにはどうするか聞きたかったんですけど・・・
今度は通じますかね?つたない説明でスミマセン・・・

Test *declare(char *name1, char *name2)
{
Test t;
Test *test = &t;
strcpy(test->name1,name1);
strcpy(test->name2,name2);
return test;
}
0949デフォルトの名無しさん2005/05/17(火) 13:29:10
>>948
declare() 抜けた瞬間に Test t は解放されるからそのコードの動作は激しく未定義だぞ。
何やりたいのかよくわからないんだが、static Test t; でもすればどうだ。
0950デフォルトの名無しさん2005/05/17(火) 13:41:34
>>948
何故ポインタを使う必要があるかと問い詰めたい('A`)

Test declare(char *name1, char *name2)
{
 Test t;
 strcpy(t.name1,name1);
 strcpy(t.name2,name2);
 return t;
}
09519502005/05/17(火) 13:43:18
あー、ちなみに>>950はTestのコピーコンストラクタが定義されてないとマズィ('A`)
09529502005/05/17(火) 13:45:39
いや、やっぱデフォルトの動作で大丈夫っぽ。
それにクラスじゃなくて構造体っぽい匂いがするな。

グダグダですまぬ('A`)
0953デフォルトの名無しさん2005/05/17(火) 13:46:39
>>950
標準 C では構造体を返すことはできない。

>>951
ここは標準 C スレ。
コピーコンストラクタはスレ違い。
0954デフォルトの名無しさん2005/05/17(火) 13:50:30
> 標準 C では構造体を返すことはできない。

ANSI 以前の C ではだった
0955デフォルトの名無しさん2005/05/17(火) 13:55:30
>>949
あ、すいません、このコードは聞きたいことの要点まとめただけの
テストプログラムなんでコード自体の目的はあんまないんです。。

ちなみにプログラム全体は

typedef struct Test{中略}Test;
Test *declare(char *name1, char *name2){中略}

int main(void)
{
char name1[10]="aaa";
char name2[10]="bbb";
Test *test1,*test2;
test1 = declare(name1,name2);
printf("test1:%s,%s\n",test1->name1,test1->name2);
test2 = declare(name2,name1);
printf("test2:%s,%s\n",test2->name1,test2->name2);
printf("test1:%s,%s\n",test1->name1,test1->name2);
return 0;
}
って感じなんです。
0956デフォルトの名無しさん2005/05/17(火) 13:56:11
んで>>949さんの言うとおりにやってみたら
実行結果が
test1:aaa,bbb
test2:bbb,aaa
test1:bbb,aaa

になったんですけどこれが
test1:aaa,bbb
test2:bbb,aaa
test1,aaa,bbb

になるようにしたいんです、てか長々とすみません・・・
あと>>950さん、なんかうちの環境ではそれそのままじゃコンパイル通んなかったです・・・
0957デフォルトの名無しさん2005/05/17(火) 14:00:42
>>948
Test *test = &t;
これを、
Test *test = malloc(sizeof (Test));
にしてみたら。

いらなくなったら free(test); で
0958デフォルトの名無しさん2005/05/17(火) 14:09:34
>>957
なんかあっさりできました・・・どうもありがとうございます。
ってかなんかすごく単純なことだったみたいですね・・・
なんか長々と書いちゃってスミマセンでした
あとレスくれたみなさんどうもありがとうございました。
0959デフォルトの名無しさん2005/05/17(火) 14:11:13
>>956
void declare(Test *t, char *name1, char *name2)
{
strcpy(t->name1,name1);
strcpy(t->name2,name2);
}
にしとけ。
0960デフォルトの名無しさん2005/05/17(火) 14:20:43
>>959
構造体の宣言はdeclare関数の中で行いたいのでちょっとそれはできないんです・・

まあでもみなさんのおかげで解決しました。
こんなことでと思われるかもしれませんけどなんだかんだで数日つまってた所なんで
解決して良かったです。ありがとうございました。
0961デフォルトの名無しさん2005/05/17(火) 14:31:41

int i=0,left=0,right=n-1, mid=0;

while(left<right){
mid=(left+right)/2;
if(goods[mid] < item) left = mid + 1;
else right = mid;
}
if(goods[left] == item)return 0;

for(i=n;i>left;i--) goods[i] = goods[i-1];

goods[left] = item;
n++;

2分探索でgoods配列を探索して同じ値が無かったら
昇順になるように、itemを配列に入れるというプログラムを作りたいのですが

配所にある程度(2つ以上?)値が入っていないと動作しませんでした。
n=0からitem追加したいのですが、どうすれば解決しますか?
頭の良いプログラマーさんお願いします。
09629612005/05/17(火) 14:37:29
ぬるぽ
0963デフォルトの名無しさん2005/05/17(火) 14:44:23
left<right だから1個以下はループ通らないってのはわかるでしょ
0964デフォルトの名無しさん2005/05/17(火) 14:48:19
誰かそろそろ次スレ立ててくれ
0965デフォルトの名無しさん2005/05/17(火) 15:44:43
SDIで作ってるのですが
エクスプローラーみたいにウィンドウ全体にリストコントロールが
表示されるようにするにはどうすればいいのですか?
コントロールだからリソースにダイアログを作ってリストビューを貼り付けるの?
0966デフォルトの名無しさん2005/05/17(火) 15:50:22
>>965
いろいろやり方はあるけれど
置きたいWindowのWM_CREATE内でCreateWindowしてやればいい。
ってこれはWin32かVC++の領域だな。
0967デフォルトの名無しさん2005/05/17(火) 16:26:38
>>963
そこまではわかりますが、解決方法がわかりません。
10個のデータを入れたところ、最初の1個が最後の配列に入り
それ以外はソートされました。

だれかお願いします。だれかお願いします。
09689652005/05/17(火) 16:26:41
あ、カキコするスレを間違えました
申し訳ない
後答えていただいてありがとうございます
0969デフォルトの名無しさん2005/05/17(火) 17:11:53
char *unko( void ) とされると、激しく見難いのは漏れだけですか?
   ↑
 関数の戻り値の型が * が右に寄ってる。
0970デフォルトの名無しさん2005/05/17(火) 17:17:13
>>967
とりあえず、0,1個の時はif文で判定して別処理しといたら
動かしてからもっといい方法がみつかることもあるさ
0971デフォルトの名無しさん2005/05/17(火) 17:18:59
やさしい970ありがとう
0972デフォルトの名無しさん2005/05/17(火) 17:19:49
>>969
その話題出したら、このスレ埋まるよ
0973デフォルトの名無しさん2005/05/17(火) 17:25:43
うん、埋まるね。
ただ、ネタ投下としてはあまり適切ではない
プロの釣り士ならgoto論争だな。
0974デフォルトの名無しさん2005/05/17(火) 17:32:37
リスト構造を用いた挿入整列のプログラムってどうやればいいんですか?
0975デフォルトの名無しさん2005/05/17(火) 17:33:38
>>962

              ,,,,,,,,,,,,,,,,,,,,
             /": : : : : : : : \
           /-─-,,,_: : : : : : : : :\
          /     '''-,,,: : : : : : : :i
          /、      /: : : : : : : : i     ________
         r-、 ,,,,,,,,,,、 /: : : : : : : : : :i    /
         L_, ,   、 \: : : : : : : : :i   / が!したら
         /●) (●>   |: :__,=-、: / <   負けだと思っている
        l イ  '-     |:/ tbノノ    \    (ニート・40歳・男性)
        l ,`-=-'\     `l ι';/      \  
        ヽトェ-ェェ-:)     -r'          ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
         ヾ=-'      /  
          |        |
  
0976デフォルトの名無しさん2005/05/17(火) 17:58:00
急速にスレの質が低下してまいりました
0977デフォルトの名無しさん2005/05/17(火) 19:09:13
>>976
ぼくがレスしたらいっつもこれが出てくるんですけど、気のせいかなぁ・・・
0978デフォルトの名無しさん2005/05/17(火) 20:17:52
プロトタイプって複数一度に宣言できなすか?
たとえば、これは可能ですか?
int func(void), *f2(void), *f3(void);
0979デフォルトの名無しさん2005/05/17(火) 20:22:28
>>980
乙
0980デフォルトの名無しさん2005/05/17(火) 21:47:17
>>979
立てらんなかったorz
0981デフォルトの名無しさん2005/05/17(火) 21:48:12
>>978
できる。
何ですぐ試せることを自分で試さないのか。
0982デフォルトの名無しさん2005/05/17(火) 22:32:15
>>980
この役立たず!
0983デフォルトの名無しさん2005/05/17(火) 23:03:00
>>982
その怒り方、まるで奥さんみたいだな
0984デフォルトの名無しさん2005/05/17(火) 23:31:20
じゃー立ててみる
09859842005/05/17(火) 23:33:02
立った。テンプレよろ

C言語なら俺に聞け! Part 107
http://pc8.2ch.net/test/read.cgi/tech/1116340323/
0986デフォルトの名無しさん2005/05/18(水) 20:12:02
(゚д゚)ウメー
0987デフォルトの名無しさん2005/05/18(水) 20:17:24
(゚д゚)ウメー
0988デフォルトの名無しさん2005/05/18(水) 20:19:45
(゚д゚)コゲー
0989デフォルトの名無しさん2005/05/18(水) 21:03:42
(゚д゚)ウマー
0990デフォルトの名無しさん2005/05/18(水) 23:50:30
(xдx)マズー
0991デフォルトの名無しさん2005/05/19(木) 00:06:29
(゚д゚)ヌルポー
0992デフォルトの名無しさん2005/05/19(木) 00:44:48
(゚д゚)カ
0993デフォルトの名無しさん2005/05/19(木) 00:47:34
(゚д゚)゙
0994マルチプロセス初心者2005/05/19(木) 00:48:10
UNIX系OSにてマルチプロセスプログラミング作っております。
それで、少し問題が・・・・・
fork()を利用して複数のプロセスを同時に起動させて
pipe()を利用して子プロセスから親プロセスへ演算結果を
返すようなプログラムを組んでおります。
それをfor文で一定以上繰り返すと、fork()自体が失敗
するようになってしまいます・・・
これの原因はどこにあるのでしょう?

ex

for( i = 1 ; i <= 100 ; i++ )
{
pid[i] = fork();
if( pid[i] == -1 ) printf("error!\n");

if( pid[i] == 0 )
{
何か色々と処理させる
exit(0);
}
}
wait();


子プロセスが1個起動して終了するまで待つのは効率が悪いので
一気に複数のプロセスを起動させて全てが終わるまで待つようにしてます。
色々と調べてみたんですが、どうしても原因がわからなかったので
どなたかご存知でしたら教えてください。
0995デフォルトの名無しさん2005/05/19(木) 00:50:24
(゚д゚)ッ
0996デフォルトの名無しさん2005/05/19(木) 01:02:35
>>994
シェルから, limit なり limits なり入力した結果を...
それ以前に, ウニ板のくだ質へ行け.
0997デフォルトの名無しさん2005/05/19(木) 02:22:19
生まれて初めて1000をとってみる
0998デフォルトの名無しさん2005/05/19(木) 02:23:30
>>997
まだあと2もあるよ?
0999デフォルトの名無しさん2005/05/19(木) 02:24:04
プログラミング作っておりますっっ!
1000デフォルトの名無しさん2005/05/19(木) 02:37:10
生まれて初めて1をとってみる
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。