C言語なら俺に聞け(入門篇) Part 13
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/05/16(水) 16:53:13・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 12
http://pc11.2ch.net/test/read.cgi/tech/1178620766/
過去スレ
Part 1 ttp://pc8.2ch.net/test/read.cgi/tech/1146700389/ Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/ Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/ Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/
Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/ Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/
Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/ Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/
Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/
0002デフォルトの名無しさん
2007/05/16(水) 16:55:31C/C++の宿題を片付けます 86代目
http://pc11.2ch.net/test/read.cgi/tech/1165718021/
くだすれC言語(初心者用) Part.2
http://pc11.2ch.net/test/read.cgi/tech/1172099763/
スレを勃てるまでもないC/C++の質問はここで 2
http://pc11.2ch.net/test/read.cgi/tech/1178503366/
はきだめC/C++下級者の質問箱 2
http://pc11.2ch.net/test/read.cgi/tech/1156206091/
関連リンク
C 関数検索 man on WWW
http://www.linux.or.jp/JM/
初心者のためのポイント学習C言語
http://www9.plala.or.jp/sgwr-t/
WikibooksのC言語の教科書
http://ja.wikibooks.org/wiki/C%E8%A8%80%E8%AA%9E
0003デフォルトの名無しさん
2007/05/16(水) 17:15:040004デフォルトの名無しさん
2007/05/17(木) 00:39:44scanfを使って2つの変数を入力したいんですが、
sanf("%d",&a,b);
こんな感じで良いのでしょうか?動作環境がないため確認お願いします。
0005デフォルトの名無しさん
2007/05/17(木) 00:40:45sanf("%d %d",&a,&b);
0006デフォルトの名無しさん
2007/05/17(木) 00:41:32>>4
scanf("%d %d",&a,&b);
0007デフォルトの名無しさん
2007/05/17(木) 00:43:05早速の回答ありがとうございました。
0008デフォルトの名無しさん
2007/05/17(木) 01:41:51main関数の中で宣言した int a[3][3]をほかに自分で宣言、定義した関数に渡すときとか。
0009デフォルトの名無しさん
2007/05/17(木) 01:50:38引数の宣言は int a[][3] でいいかな
0010デフォルトの名無しさん
2007/05/17(木) 02:04:14回答、ありがとうございました
0011デフォルトの名無しさん
2007/05/17(木) 15:53:010012デフォルトの名無しさん
2007/05/17(木) 15:56:26cにはnewなんてありません。
0013デフォルトの名無しさん
2007/05/17(木) 16:17:42(ここでの単語とは、ブランク,タブ,改行文字で区切られた文字)
例えば、
This is a book.
と入力すると、
This
is
a
book.
と表示される。
while((c=getchar()) != EOF)
という文を使って文章を入力するらしいのですが、どうやって表示させればいいのかわかりません。
教えてください。
0014デフォルトの名無しさん
2007/05/17(木) 16:20:01001513
2007/05/17(木) 16:21:45すみませんでした。
0016デフォルトの名無しさん
2007/05/17(木) 17:34:160017デフォルトの名無しさん
2007/05/17(木) 17:50:57while((c=getchar())!=EOF) {
putchar(c);
if(c==' '||c=='\t'||c=='\n') putchar('\n');
}
0018デフォルトの名無しさん
2007/05/17(木) 19:04:11改行セパレータの時に二重改行しちゃうかららめぇ。
if(c==' '||c=='\t'||c=='\n') putchar('\n'); else putchar(c);
0020デフォルトの名無しさん
2007/05/17(木) 20:13:17こうやってスレの使い分けも出来ない莫迦が存在する限り、このスレは必要なんですよ。
0021デフォルトの名無しさん
2007/05/17(木) 20:15:55それは>13に書かれた要件を超えた要求だな。
そもそも○投げなら宿題スレにいけ。
0023デフォルトの名無しさん
2007/05/17(木) 20:21:36スレの先頭くらい見ような。
>1 名前:デフォルトの名無しさん[] 投稿日:2007/05/16(水) 16:53:13
>C言語の入門者向け解説スレです。
>・C++言語はスレ違いです。
>・分からない事をなるべく詳しく書いて下さい。
>・ソースコードを晒すと答えやすくなるかもしれません。
>・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
>前スレ
>C言語なら俺に聞け(入門篇) Part 12
>http://pc11.2ch.net/test/read.cgi/tech/1178620766/
>
>過去スレ
>Part 1 ttp://pc8.2ch.net/test/read.cgi/tech/1146700389/ Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/
>Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/ Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/
>Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/ Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/
>Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/ Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/
>Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/ Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/
>Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/
>
>2 名前:デフォルトの名無しさん[] 投稿日:2007/05/16(水) 16:55:31
>関連スレ
>C/C++の宿題を片付けます 86代目
>http://pc11.2ch.net/test/read.cgi/tech/1165718021/
>くだすれC言語(初心者用) Part.2
>http://pc11.2ch.net/test/read.cgi/tech/1172099763/
>スレを勃てるまでもないC/C++の質問はここで 2
>http://pc11.2ch.net/test/read.cgi/tech/1178503366/
>はきだめC/C++下級者の質問箱 2
>http://pc11.2ch.net/test/read.cgi/tech/1156206091/
0024デフォルトの名無しさん
2007/05/17(木) 20:21:47【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
http://pc11.2ch.net/test/read.cgi/tech/1170338926/
くだすれC言語(初心者用) Part.2
http://pc11.2ch.net/test/read.cgi/tech/1172099763/
【初心者歓迎】C/C++室 Ver.34【環境依存OK】
http://pc10.2ch.net/test/read.cgi/tech/1169039760/
0025デフォルトの名無しさん
2007/05/17(木) 21:18:060026デフォルトの名無しさん
2007/05/17(木) 21:26:28ttp://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_2.html
-o file
002725
2007/05/17(木) 23:01:48有難う御座いました。
0028sage
2007/05/18(金) 03:12:47辞書順にクイックソートするアルゴリズムを作ったのですが、
並び替えた結果を見ると、ところどころ並び替えを間違えています。
原因がまったくわかりません。どのように直せばいいのでしょうか?
line[]が文字列の入っている配列です。
void Swap(int i, int j) //交換する
{a = line[i];
line[i] = line[j];
line[j] = a; }
void QSort(int left, int right)
{ int i,j,middle;
i = left; /* ソートする配列の一番小さい要素の添字 */
j = right; /* ソートする配列の一番大きい要素の添字 */
middle = (left + right) / 2; /* 基準値を配列の中央付近にとる */
while (1) {
while (strcmp(line[i],line[middle])<0) /* 基準より辞書順に後ろにある文字列が */
i++; /* 出るまで i を増加させる */
while (strcmp(line[j],line[middle])>0) /* 基準より辞書順に前にある文字列が */
j--; /* 出るまで j を減少させる */
if (i >= j) break; /* i >= j なら無限ループから抜ける */
Swap(i, j); /* line[i] と line[j]を交換 */
if ((middle -left) > 0) /* 基準値の左に 2 以上要素があれば */
QSort(left, middle-1); /* 左の配列を クイックソートする */
if ((right - middle)> 0) /* 基準値の右に 2 以上要素があれば */
QSort(middle+1, right); /* 右の配列を クイックソートする */
}
0029デフォルトの名無しさん
2007/05/18(金) 04:15:50を
line[i]-line[middle]<0
にしてみたら?その下も同じ。
strcmpは文字列を比較する関数であって、
1文字をあらわすline[i]の比較には使えない。
0030デフォルトの名無しさん
2007/05/18(金) 05:12:33line[middle]と同じ値は左右どっちに移動すると思う?
>>29
そんなミスだったらコンパイル通らないでしょ。
003130
2007/05/18(金) 05:27:53これはちょっと言葉が足りなかった、すまん。
1, 2, 50, 1, 1
こんな例で考えてみればわかるかな。
0032デフォルトの名無しさん
2007/05/18(金) 06:33:22どういう風に組むのがいいでしょうか?
0033デフォルトの名無しさん
2007/05/18(金) 06:42:16C++でvectorを使う
0034デフォルトの名無しさん
2007/05/18(金) 06:54:25malloc() realloc() free() などを使うといいと思うよ
0035デフォルトの名無しさん
2007/05/18(金) 10:46:41セレクタ値とオフセットアドレスで指定しているのかを知りたいですが、
#include <stdio.h>
void foo(void){};
int main(void)
{
void (*hoge)()=foo;
printf("hoge of address is %p\n",hoge);
return 0;
}
これを実行したら
hoge of address is 00401000
と表示されました。
この上位16ビット(0040h)はセレクタ値で、下位16ビット(1000h)がオフセットアドレスですか?
0036デフォルトの名無しさん
2007/05/18(金) 11:11:570037デフォルトの名無しさん
2007/05/18(金) 11:33:490038デフォルトの名無しさん
2007/05/18(金) 11:53:15003935
2007/05/18(金) 12:16:52その本ではリアルモードの時に関数へのfarポインタにセレクタ値16ビットと関数のオフセットアドレスをくっ付けたものを代入して
プロテクトモードに移行してからそのポインタを参照してました
0040デフォルトの名無しさん
2007/05/18(金) 12:30:50>環境はWinXP
これでかなーり事情が変わるので Advanced Windows でも嫁となる
0041デフォルトの名無しさん
2007/05/18(金) 12:57:06OSのブート部分を書くのでない限り、セグメントのことは忘れてあげて
ください。
0043デフォルトの名無しさん
2007/05/18(金) 16:52:24はじめて読む486だったら、もっと後のページで32ビットアドレスの話が出てくるはず。
これはようするにオフセットが32ビットになっているモード。
Win32アプリケーションは、その32ビットアドレスのモードで動く。
35のコードで出力された32ビットのアドレスも全てオフセット値。
ちなみに、Win16アプリケーションなら16ビットセレクタと16ビットオフセットを使う。
0044デフォルトの名無しさん
2007/05/18(金) 18:25:45fgetsは読み込んだ文字列がバッファに入りきったかどうか判別できませんよね?
改行で読み終わった場合は、バッファに改行コードがあるかどうかで読みきれたかどうか
判別できます。しかしEOFで読み終わった場合はそれが判別できないと思うのですが。
入力→バッファがあふれたらstdinをクリアして再入力
という処理を確実に行うにはどうすればいいのでしょうか。
0046デフォルトの名無しさん
2007/05/18(金) 18:55:50>EOFで読み終わった場合はそれが判別できないと思うのですが。
char buf[1000];
fgets(buf,1000,stream);
だとして
文字数のチェックして999未満ならEOF、または改行で終了した
そして最後に改行文字がなければEOFって判断できるんじゃない?
0047デフォルトの名無しさん
2007/05/18(金) 18:59:190048デフォルトの名無しさん
2007/05/18(金) 19:01:07fgets は,stream から文字を読み込んで文字列 s に格納します。読み込みは n-1 個の文字を読み込むか,または改行文字を読み込んだときに終了します。
改行文字で終了した場合には fgets は,s の最後に改行文字を格納します。
s に読み込まれた文字の最後にはヌルターミネータが付加されます。
0049デフォルトの名無しさん
2007/05/18(金) 19:02:42>EOFで読み終わった場合は
読み込み中にファイルの終わりに達したら
そこまでのデータが読み込まれる。
↓
更に読もうとしたら NULL が返るし、feof() を呼べば 0 以外が返る。
>バッファがあふれたらstdinをクリアして再入力
バッファを拡張して続きを読めばいいでないの。
>>47
fread() と間違えてる?
0050デフォルトの名無しさん
2007/05/18(金) 19:09:30バッファぴったりに読んだ場合、更に読もうとしたら入力待ちにならない?
0051デフォルトの名無しさん
2007/05/18(金) 19:14:570052デフォルトの名無しさん
2007/05/18(金) 19:17:10思いっきりボケてたわスマン
恥ずかしい・・・
0053デフォルトの名無しさん
2007/05/18(金) 19:24:36ごめん、俺よくわかってない、入力待ちって?
>バッファぴったりに読んだ場合
char buf[10];
fgets(buf,10,stream);
として9文字の入力を読み込んだときってこと、それとも10文字?
0054デフォルトの名無しさん
2007/05/18(金) 19:26:250055デフォルトの名無しさん
2007/05/18(金) 19:45:420056デフォルトの名無しさん
2007/05/18(金) 19:49:05そういうこなのかな
stdinから読み込んでバッファが空になったら入力待ちになるのは当然な気が・・・
それでも問題にはならないと思うけど
こんなコードでも問題なく動作するし
#include <stdio>
int main()
{
FILE *in;
char buf[5];
while(fgets(buf,5,stdin)!=0)
{
printf("%s ",buf);
}
return 0;
}
0057デフォルトの名無しさん
2007/05/18(金) 19:49:460058デフォルトの名無しさん
2007/05/18(金) 19:59:432回目の入力待ちは避けたい場合ね。
0059デフォルトの名無しさん
2007/05/18(金) 20:00:30改行含めて4文字以下のときにアウトだろ
0060デフォルトの名無しさん
2007/05/18(金) 20:03:39そういうことか
>>59
>>58って事ならアウトだね、確かに
006144
2007/05/18(金) 20:33:05安全な入力を実現するにはどうすればいいかを考えており、
検証するためにテストプログラムを作っています。
http://www.uploda.net/cgi/uploader4/index.php?file_id=0000013415.c
このプログラムで、改行で読み終える場合はバッファオーバーフローの
危険を回避することが出来たのですが、EOFで入力を終了した場合の
対応策を考えられなかったので、このような質問をしました。
006244
2007/05/18(金) 22:05:46適切ではありませんね。すみません。
バッファサイズを超える入力を受けたとき、環境に依存しない方法で
stdinをクリアし、再入力を促す。ということです。
0063デフォルトの名無しさん
2007/05/18(金) 22:15:50ソース見ていいたい事分かった・・・気がする
極力元ソース変えないようにしたけどこれではダメ?
#include <stdio.h>
#include <string.h>
int main(void)
{
int num = 0;
char c,buf[5];
for (;;) {
printf("整数を入力してください : ");
fgets(buf, sizeof(buf), stdin);
/* バッファサイズをオーバーした場合、stdinをクリアし、再入力 */
if (strchr(buf, '\n') == NULL) {
scanf("%*[^\n]%*c");
/* 正常に読み取れた場合 */
} else {
if (sscanf(buf, "%d", &num) != EOF) {
break;
}
}
fprintf(stderr, "入力でエラーが発生しました\n再入力してください\n");
}
printf("num = %d\n", num);
return 0;
}
006463
2007/05/18(金) 22:19:24if (strchr(buf, '\n') == NULL) {
scanf("%*[^\n]%*c");
}
fgetsでbuf に取り込んだ文字列内に'\n'がない場合は
scanf("%*[^\n]%*c"); によって入力バッファの以降の文字をスキップする
正確には %*[^\n] で'\n'の一つ前までをスキップして %*c で'\n'そのものをスキップする
でバッファ内には残らなくなる・・・的な・・・
006863
2007/05/19(土) 20:06:13scanf("%*[^\n]%*c"); を rewind(stdin); に変えると環境によってはうまくいくんだけど
MS的にはおkとしている
でも他の環境だと・・・
環境依存なものはダメだよね?
0069デフォルトの名無しさん
2007/05/19(土) 20:18:49007044
2007/05/19(土) 20:26:58環境依存OKだとその方法で出来てしまうんですよね…。
if (feof(stdin)) {
/* エラー処理 */
exit(1);
}
このへんで妥協するしかないですかね。
どうやらfgetsはEOFで読み終わった場合はstdinにEOFが残された状態になるらしく、
再入力を求める場合、どうしても無限ループになってしまいます。
007163
2007/05/19(土) 20:41:25そうなの?
ファイルの終端に達したからといってクローズされるとは思わないけど
それとも勝手に閉じられてしまうの?
>>70
って事は環境依存はダメって事ね
0073デフォルトの名無しさん
2007/05/19(土) 22:01:130075デフォルトの名無しさん
2007/05/20(日) 00:26:01しかし行列をtempという作業用行列に渡す時にエラーが出ます。
http://www.uploda.org/uporg815439.c.html
環境はgcc3.3.6
どこがいけないのでしょうか。教えてください。
ちなみにベクトルの代入は成功してるようです。
0076デフォルトの名無しさん
2007/05/20(日) 00:44:28多次元配列(厳密にはただの配列と一緒なんだが・・・)を仮引数とするときは
最初(最後だったかもしれん)の1つ以外は指定しなければならないという制限があったはず
そうしないとコンパイラがポインタ値をいくつスライドさせりゃいいのか分からんからな
0077デフォルトの名無しさん
2007/05/20(日) 00:54:00http://www.uploda.org/uporg815517.c.html
一応行列式は算出してくれます。
でもこれだと100次元にするときはいちいち3を100に書き換える必要がある。
これじゃ次元をint nで渡してる意味がない。
せめて[][2]を[][n]という形でかけるといいのですが、やりかたはないでしょうか?
007863
2007/05/20(日) 01:00:21関数宣言で
int a_substitute(int a[][])
としているでしょ
関数に配列を渡すときには”配列”としてではなく”ポインタ”として渡される
引数に配列が使えるのはコンパイラ段階で引数が分かっていることが前提
ところがコンパイラ上で渡された配列のサイズが不明なためコンパイルできない
int a_substitute(int a[][2]) とすればコンパイルは通る
と計算といってるけど、これからその部分書くの?
0080デフォルトの名無しさん
2007/05/20(日) 01:02:26プログラムうp遅れすまそ。
上にうpしたやつです。名前はmatrix.cといいます。
しかしこれでは希望の仕様を満たさない。
どうすればいいのやら・・・これが出来たら次は外積のプログラムを作りたいのですが。
これでは応用が効かない。
0081デフォルトの名無しさん
2007/05/20(日) 01:02:28手持ちのC99仕様書によるとこういう宣言も認められるらしいが使ったことないので分からん
試してみてくれ
T foo(int n, int m, T' a[n][m]);
0082デフォルトの名無しさん
2007/05/20(日) 01:03:53main関数内で行列なりベクトルなりの次元を取得して
それを引数にするためプリプロセッサでは無理ですね。
それでは書き換えるのと大差ない。
0083デフォルトの名無しさん
2007/05/20(日) 01:04:45ど、どういう意味ですかその宣言方法は。
なんか光明が
0084デフォルトの名無しさん
2007/05/20(日) 01:07:58double *temp;
//中略
temp = (double*)malloc(sizeof(double)*n*n);
for(i=0; i<n; i++) for(j=0; j<n; j++) temp(i*n+j) = a(i*n+j)
//後略
ってやるのはどう?
関数に渡すときにキャストして。
0085デフォルトの名無しさん
2007/05/20(日) 01:10:07おそらくC99で追加された可変長配列(配列宣言時にConstantでなくVariableを大きさとして指定できる配列)を
仮引数並びに使ってるんだろうが詳しくは知らん
gcc3.3.6ならC99対応してるだろうからおそらく通るとは思うが通らない可能性も否定できん
0086デフォルトの名無しさん
2007/05/20(日) 01:13:47main () {
char text;
printf ("Please Input Key : ");
text = getchar ();
printf ("Input key is %c.",text);
if (text != 'z') {
printf ("\nPlease Input Key : ");
text = getchar ();
switch (text) {
case 'Y':
case 'y':
printf ("Y");
0087デフォルトの名無しさん
2007/05/20(日) 01:14:50case 'N':
case 'n':
printf ("N");
break;
default:
printf ("$");
}
}
return 0;
}
0089デフォルトの名無しさん
2007/05/20(日) 01:16:21なんとなくやってみたら出来たっ!!
(a[][n], int n) => (int n, a[][n])
と後ろに置けばおkみたいですね。もちろんa[n][n]でもおk(まぁ無駄だけど)
感動・・・
完成プログラムを置いておきます。
http://www.uploda.org/uporg815567.c.html
a[0][n]がいいかa[n][n]がいいか。どちらがベストかは微妙です。
0090デフォルトの名無しさん
2007/05/20(日) 01:19:00配列わかってねー
0091デフォルトの名無しさん
2007/05/20(日) 01:19:18メッセージを出し、キーを入力させ
入力したキーを表示させます
もし入力されたキーがzなら終了
z以外なら再入力を促し
YないしyならYを表示→終了
NないしnならNを表示→終了
それ以外なら$を表示→終了
としたいのですが、どうも再入力を受け付けてくれません
この場合、変数を増やしてやるほかに方法は無いのでしょうか?
rewind (stdin);を入れてやれば、一応は解決したのですが
こうするとバッファデータが全部ロストするみたいなので、余り良くないんじゃないかなぁ・・・と
それとrewind (stdin);を入れて、再入力した場合
何を入れても$が表示されてします
復改というのでしょうか?
\nが混じるのが問題みたいなんですが
これを除去する良い方法はないのでしょうか?
0092デフォルトの名無しさん
2007/05/20(日) 01:19:52むつかしい。理解不能でつ
キャストとかポインタが連発するともう解析不可能・・・
0094デフォルトの名無しさん
2007/05/20(日) 01:22:24その方法だと、配列が小さいときは良いが、でかくなったときにオーバーヘッドが大きすぎないか?
0095デフォルトの名無しさん
2007/05/20(日) 01:22:52訂正
”それとrewind〜方法はないのでしょうか?”は無視してくださってかまいません
ですが、改行を読み飛ばす方法は教えてくださると幸いです
調べたらgetchar ();をダブらせるといいとか、fgetsで関数を組むみたいなことを見つけたのですが
いかんせん上手くいきません・・・
0096デフォルトの名無しさん
2007/05/20(日) 01:23:40*temp(i*n+j) = *a(i*n+j)
だろ
0097デフォルトの名無しさん
2007/05/20(日) 01:24:02現在stdinにある文字を改行含めて読み飛ばすならこれでいける
scanf("%*[^\n]%*c");
0098デフォルトの名無しさん
2007/05/20(日) 01:27:38なんか混ざってるw
p[i*n+j]もしくは*(p+i*n+j)が正解
0099デフォルトの名無しさん
2007/05/20(日) 01:45:40固定長の配列版と較べて、遜色ない速度にまで最適化されるから心配なし。
つーか、激しく常套手段。ついでに、i * n + jの部分を別関数にしても問題なし。
Ex. size_t offset(unsigned, i, unsigned j, size_t n) {return i * n + j;} ... temp[offset(i, j, n)] = a[offset(i, j, n)];
0100デフォルトの名無しさん
2007/05/20(日) 01:48:51>>86-87の派生版に
それを組み込んでみたんですが、上手く動作しません
原因は大体解ってるんですが、やり方がわからないんですよね・・・
ソース
http://www.borujoa.org/upload/source/upload11705.c
scanf("%*[^\n]%*c");の組み込み位置が可笑しいのは解ってるんですが
(一応、前のtextに引っ掛けてるつもりです)
全部読み飛ばすと判定が出来なくなるというか、入力する意味が失われますので
getcharで読み飛ばしを試みてるのですが、どうしても読み飛ばされないです
どうすればswitchの判定を有効に出来るのでしょうか?
(printfで確認した限りでは、defaultしか動いてない)
0101デフォルトの名無しさん
2007/05/20(日) 02:06:38処で、switchがまともに動かない直接原因ではないが、getchar()の戻り値はintで受けるべき。
で、EOFが帰ってきたらその処理もした方がよさそうだが。
0102デフォルトの名無しさん
2007/05/20(日) 09:44:130103デフォルトの名無しさん
2007/05/20(日) 09:58:380104デフォルトの名無しさん
2007/05/20(日) 10:14:55double * make_rotate_array(double angle)
のように例えば角度を引数として回転行列をreturnしてくれるような。
一度やったら
なんかローカル変数のポインタを参照にしちゃってます
的なことをいわれて凹んだ。ここでmallocですかね?
0105デフォルトの名無しさん
2007/05/20(日) 12:45:100106デフォルトの名無しさん
2007/05/20(日) 14:22:06コマンドライン引数でファイル名を受け取りその中身(テキスト)を標準出力する
というプログラムを作っていて、ある時から「MZP」という文字列が出力されるようになりました。
MZPってなんなんですか?
0107デフォルトの名無しさん
2007/05/20(日) 14:26:520108デフォルトの名無しさん
2007/05/20(日) 19:52:56Windowsの.exeとかをバイナリエディタで開けば解るお
0109デフォルトの名無しさん
2007/05/21(月) 05:35:11コンパイラ:gcc
こんばんは、ppm形式(フルカラーraw形式)の画像のピクセルごとの,R,G,Bの色のデータを
メモリを動的に確保して1次元の配列にぶち込みました。
これを任意の角度回転しようと考えているのですが、
どうも1次元の配列ですと直交座標で扱いにくく困っています。
そこで新たに二次元配列を動的に確保して・・・とも考えたのですが
元画像、出力画像のデータを取り込んでいるので、得策でもないような気がします。
なんとか直交座標系として扱いつつ、元画像を回転させて出力画像を作る方法ありませんでしょうか?
ソースがあるだとかよい案があればよろしくお願い致します。
0110デフォルトの名無しさん
2007/05/21(月) 08:41:47何が問題なのか判らない。全く同じ質問を他のスレでもしていたようだが
貰ったレスに対しても碌な返事していなかったようだし、
少々落ち着いて他人に伝えるという努力をしてみるといいかもしれない。
そもそも、画像の回転の方法は判っているのか?
どうも、画像処理の基礎知識も幾何数学の素養も無い気がしてならない。
0111デフォルトの名無しさん
2007/05/21(月) 08:50:18専門じゃないんで・・・
0112デフォルトの名無しさん
2007/05/21(月) 08:52:39前者なら、具体的な要件をまとめて宿題スレへ、後者は勝手にどうぞ。
コーディングに際して何か疑問があるようならここかどこか、適当なスレで承ります。
0113デフォルトの名無しさん
2007/05/21(月) 09:07:31こんな感じのもの作れば楽になるんじゃない?
int pos2index(width, height, x, y){
if(width<=0 || height<=0 || x<0 || y<0 || x>=width || y>=height) return -1;
return width*3*y+x*3;
}
0114デフォルトの名無しさん
2007/05/21(月) 12:09:481次元配列で直交座標系における回転を行うことができる方法があればと思いました
別のスレで誘導され、返事のほうはさせていただいたつもりですが。
>>111-113
どうもありがとうございます
使ってみてダメなようであれば質問スレに行くことにします。
0115デフォルトの名無しさん
2007/05/21(月) 14:10:45そうやって数学まで落としてくれればわかりやすい。
つまり1次元配列で3次元の基底変換をしたいんだろ
無理に決まってんじゃん・・・
3*3の回転行列が必要に決まってる。
高崎先生がおれにそう教えてくれたっ!
0116デフォルトの名無しさん
2007/05/21(月) 14:34:030117デフォルトの名無しさん
2007/05/21(月) 14:42:530118デフォルトの名無しさん
2007/05/21(月) 16:26:260119デフォルトの名無しさん
2007/05/21(月) 16:45:580120デフォルトの名無しさん
2007/05/21(月) 16:55:480121デフォルトの名無しさん
2007/05/21(月) 17:07:00Q[i]の値を全てQ[i+1]にコピーして、Q[i+1]の最後にaと0を代入する関数です。
一応はうまく動くのですが、i=4, j=3になると
Q[i+1] = realloc(Q[i+1], sizeof(int)*(j+1));
のところでセグメントエラーを起こしてしまいます。
その理由がわからず、途方にくれています。
助けてください。
void copyArray2(int *Q[], int i, int a){
int j, k;
j = count(Q[i]);
Q[i+1] = realloc(Q[i+1], sizeof(int)*(j+1));
for(k=0; k<j; k++){
Q[i+1][k] = Q[i][k];
}
Q[i+1][k] = a;
Q[i+1][k+1] = 0;
return;
}
0122デフォルトの名無しさん
2007/05/21(月) 17:09:56横の数足りてないだろ。
Q[i+1][k] = a; /* k == j */
Q[i+1][k+1] = 0; /* k == j+1 */
0123デフォルトの名無しさん
2007/05/21(月) 17:29:02標準入力から読込んだ文字を判別する際に、
改行(¥n)などは判別できるのですが
矢印キーなどはどの文字で判別すればよいのか分かりません
エスケープシーケンスなどが存在するのでしょうか?
ちなみに開発環境はLinux上でgccコンパイラを使用してます
0124デフォルトの名無しさん
2007/05/21(月) 17:30:27標準入力を使うのはやめた方がいい。
リダイレクトされると泣ける。
0125デフォルトの名無しさん
2007/05/21(月) 17:31:31shell が喰ってしまってアプリケーションに渡らないかもしれない
0127121
2007/05/21(月) 18:14:53ありがとうございます。
この関数部分についてはうまく行くようになりました。
しかし他の部分でもバグが出て泣きそうです。
でもしばらくは自力で頑張ってみます。
0128デフォルトの名無しさん
2007/05/21(月) 19:31:26って本を大学の図書館で借りてきた。
楽しみだおわくわく
数値計算においてはC>>>>>>>>>C++
C++は必要なし。
0129デフォルトの名無しさん
2007/05/21(月) 20:00:300130デフォルトの名無しさん
2007/05/21(月) 20:16:21C++を使うと複素数演算がきれいに出来る
0131デフォルトの名無しさん
2007/05/21(月) 20:26:070132デフォルトの名無しさん
2007/05/21(月) 20:26:45何せC++で書く意味が無いようなプログラムがずらずら並んでる
しかも糞高い
0133デフォルトの名無しさん
2007/05/21(月) 20:28:110134デフォルトの名無しさん
2007/05/22(火) 10:31:54>数値計算においてはC>>>>>>>>>C++
何を比べているのかさっぱり判りませんが、そのあたりが
「莫迦は不等号を好んで使う」と言われる所以なんでしょうね。
>>130
C99 にもありますね<複素数
もっとも gcc くらいしか選択肢がないですが。
0135デフォルトの名無しさん
2007/05/22(火) 10:43:42FORTRAN のから無理矢理作った感じの本。
いくつかバグもあったと思うよ。
まあ、理論のところは役に立つと思うけど。
0136デフォルトの名無しさん
2007/05/22(火) 11:05:15Numerical Recipes in C++ということなのか、そりゃあ仕方ないな
0137デフォルトの名無しさん
2007/05/22(火) 11:06:38つ[icc]
0138解いてください。お願いします。
2007/05/22(火) 11:26:03プログラムは、0未満24以上の時間が入力されるまで繰り返しなさい。
0時〜3時 :Good night
4時〜11時 :Good morning
12時〜16時 :Good afternoon
17時〜20時 :Good evening
21時〜23時 :Good Night
但し、一つの整数を引数とし、引数で指定された数値によって、上記メッセージを出力する関数を
作り、main関数では、その関数を呼び出すようにしなさい。
0139デフォルトの名無しさん
2007/05/22(火) 11:36:460140デフォルトの名無しさん
2007/05/22(火) 11:41:35C/C++の宿題を片付けます 87代目
ttp://pc11.2ch.net/test/read.cgi/tech/1179025919/
0141デフォルトの名無しさん
2007/05/22(火) 12:33:030143デフォルトの名無しさん
2007/05/22(火) 16:44:040144デフォルトの名無しさん
2007/05/22(火) 19:18:06以下のようなプログラムで試したんですが、
64bitOSだとサイズが出せます。
環境はlinux,gccです。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int ac, char **av)
{
if(ac != 2){
printf("No filename\n");
return 1;
}
FILE *fp = fopen(av[1],"rb");
0145デフォルトの名無しさん
2007/05/22(火) 19:18:58int n;
if(fp != NULL){
struct stat s;
if((n = fileno(fp)) != -1)
printf("fp is valid.\n");
else
printf("fp is invalid.\n");
if(!fstat(n, &s)){
printf("OK\n");
printf("Size is %ld\n", (long)s.st_size);
fclose(fp);
}
else
printf("NG\n");
}
else
printf("NG\n");
return 0;
}
0146デフォルトの名無しさん
2007/05/22(火) 19:23:410147デフォルトの名無しさん
2007/05/22(火) 19:56:16なんで構造体があるのにオブジェクト指向じゃないんですか?
メソッドがないからですか?
継承がないからですか?
オーバーロードが出来ないのがいたすぎ
0148デフォルトの名無しさん
2007/05/22(火) 19:57:250149デフォルトの名無しさん
2007/05/22(火) 20:07:460150デフォルトの名無しさん
2007/05/22(火) 20:13:180151デフォルトの名無しさん
2007/05/22(火) 20:20:57構造体とOOPは何の関係もないし
オーバーロードとOOPもまた、何の関係もない。
0152デフォルトの名無しさん
2007/05/22(火) 20:23:07が、文法の枠組みの外の実装となるので、書き辛い
0153デフォルトの名無しさん
2007/05/22(火) 20:26:28オブジェクト指向的なプログラミングはできるし、
それに構造体が必須なのも事実。
0154デフォルトの名無しさん
2007/05/22(火) 20:35:35int x = 10;
p = &x;
printf("%d", *p);
これでは10が表示されるみたいですが、
char *p;
p = "aaaa";
printf("%s", *p);
こうするとエラーがでます。printf("%s", p)とすればaaaaと表示されます。
1番目に書いたほうは理解できたのですが、
同じように考えて2番目もするとエラーでした。
この違いはなんなんでしょうか?
0155デフォルトの名無しさん
2007/05/22(火) 20:37:170156デフォルトの名無しさん
2007/05/22(火) 20:49:27"%d"は値を10進表記で出力
"%s"は値を0終端文字列の先頭アドレスとみなして文字列を出力
0157デフォルトの名無しさん
2007/05/22(火) 20:56:47cの言語仕様自体には文字列型というものは無いんだ。
文字の配列を文字列として扱う関数が標準で用意されているだけ。
char ** p;
char * x = "aaaa";
p = &x;
printf("%s", *p);
これでaaaaが出るよ。
0158デフォルトの名無しさん
2007/05/22(火) 20:58:51多分ベテランさんなら楽勝だと思うんだけど、俺C言語苦手だなぁ・・・。
0159デフォルトの名無しさん
2007/05/22(火) 21:00:27やってみたけどうまくいかない、というのなら、
自分で書いたソース付きでさらに条件付きで可。
0160デフォルトの名無しさん
2007/05/22(火) 21:02:58アリガトス
0161デフォルトの名無しさん
2007/05/22(火) 21:03:30off_tとかでぐぐれ。
0162デフォルトの名無しさん
2007/05/22(火) 21:10:29ないとしたらC言語はとっくに消えていると思うのですが。
どうも++って名前が気にいらない。
0163デフォルトの名無しさん
2007/05/22(火) 21:11:510164デフォルトの名無しさん
2007/05/22(火) 21:12:37可変長配列、とか。
0165デフォルトの名無しさん
2007/05/22(火) 21:16:18ソース付きというか初めからソース書いてて一つ穴開いてるんだけど
開いてる部分を埋めて動作を記入しろって問題。
実際埋めて実行してみたんだけど、間違ってるような気がしてならない。
0166デフォルトの名無しさん
2007/05/22(火) 21:16:59仕様の少なさ
0167デフォルトの名無しさん
2007/05/22(火) 21:17:45結果が正しいなら、とりあえずそれで提出したら?
間違ってたら、それはそれで勉強になる。
0168デフォルトの名無しさん
2007/05/22(火) 21:18:57あれ、俺書き込もうとしてやめたはずなんだが…
0169デフォルトの名無しさん
2007/05/22(火) 21:19:390171デフォルトの名無しさん
2007/05/22(火) 21:21:04日文でおk
0173デフォルトの名無しさん
2007/05/22(火) 21:25:54------------------------------ short.c ------------------------------
#include <stdio.h>
int main(void)
{
short int a;
printf("sizeof a = %d Byte\n", sizeof a);
a = 4;
printf("4(16) = %08x\n", a);
a = -6;
printf("-6(16) = %08x\n", a);
return 0;
}
---------------------------------------------------------------------
つづく...
0174173
2007/05/22(火) 21:27:09sizeof a = 2 Byte
4(16) = 00000004
-6(16) = fffffffa
と表示されます。
short は 2 バイトなのに -6 を代入すると fffffffa になるのは
なぜなんでしょう?
変数 a が short なので本来ならば printf("%04hx\n", a); としなければ
いけないのはわかっているのですが、-6 の代入で上位 2 バイトにも ff が
代入されるということは short の宣言で確保した 2 バイト以上の
領域にも代入されているということになって
メモリの領域破壊につながらがらないのでしょうか?
どうかご教授をお願い致します。
0175デフォルトの名無しさん
2007/05/22(火) 21:32:48みんなintへ昇格するから。
0176デフォルトの名無しさん
2007/05/22(火) 21:33:372) 変換指定子 x は unsigned int を期待する。 hx なら unsigned short int
0177デフォルトの名無しさん
2007/05/22(火) 22:34:42ありがとうございました。
>>144で
-printf("Size is %ld\n", (long)s.st_size);
+printf("Size is %Ld\n", (long long)s.st_size);
として
-D_FILE_OFFSET_BITS=64をコンパイルflagに
加えたところ、ばっちり表示できました。
0178173
2007/05/22(火) 23:11:32printf の引数渡しの段階で型変換が行われていたんですね。
勉強になりました。ありがとうございました。
0179デフォルトの名無しさん
2007/05/22(火) 23:17:580180デフォルトの名無しさん
2007/05/22(火) 23:19:58関数の外に書く方がおかしいです。
0181デフォルトの名無しさん
2007/05/22(火) 23:39:100182デフォルトの名無しさん
2007/05/22(火) 23:46:171.「*」を並べて下図のような三角形を作るプログラムを作成せよ。
ただし、プログラム中にはprintf("*")とprintf("\n")を各1回のみ使い作成せよ。
*
**
***
****
*****
******
0183デフォルトの名無しさん
2007/05/22(火) 23:49:10(1)
******
*****
****
***
**
*
(2)
******
*****
****
***
(3)
***
****
*****
******
***
****
*****
******
***
****
*****
******
0184デフォルトの名無しさん
2007/05/22(火) 23:51:20**
****
******
(5)
*****
***
*
0185デフォルトの名無しさん
2007/05/22(火) 23:55:260186デフォルトの名無しさん
2007/05/22(火) 23:55:51#define p printf("*");
#define n printf("\n");
int main(){p n p p n p p p n p p p p n p p p p p n p p p p p p n}
0187デフォルトの名無しさん
2007/05/22(火) 23:56:21#define A printf("*")
#define B printf("\n")
int main(){A;B;A;A;B;A;A;A;B;A;A;A;A;B;A;A;A;A;A;B;return 0;}
宿題なら宿題スレへ
0188デフォルトの名無しさん
2007/05/22(火) 23:57:240189デフォルトの名無しさん
2007/05/22(火) 23:59:060190デフォルトの名無しさん
2007/05/23(水) 00:00:520192182
2007/05/23(水) 00:05:300193デフォルトの名無しさん
2007/05/23(水) 00:12:36自分が意図した答えではないと腹を立てるのが日本の世間一般だから
何事にも察しと思いやり
0194デフォルトの名無しさん
2007/05/23(水) 08:15:010195デフォルトの名無しさん
2007/05/23(水) 08:17:310196デフォルトの名無しさん
2007/05/23(水) 08:19:390197デフォルトの名無しさん
2007/05/23(水) 08:22:050198デフォルトの名無しさん
2007/05/23(水) 08:24:30なにを使うのですか?
どのように表示を
0199デフォルトの名無しさん
2007/05/23(水) 08:29:240200デフォルトの名無しさん
2007/05/23(水) 08:48:14けたけたw
0201デフォルトの名無しさん
2007/05/23(水) 13:57:130202デフォルトの名無しさん
2007/05/23(水) 14:49:000203デフォルトの名無しさん
2007/05/23(水) 14:59:308バイト実数だとして1.1GByteか。豪気だな。
0204デフォルトの名無しさん
2007/05/23(水) 15:02:17一次元配列に転写して、一気に動的メモリ確保するのが一番。
Ex.
static unsigned offset(int x, int y, int n, int width, int height) {return x + y * width + n * width * height;}
int * array = malloc(sizeof(* array) * 1000*500*300);
for (int in = 0; in < 300; ++in) {
for (int iy = 0; iy < 500; ++iy) {
for (int ix = 0; ix < 1000; ++ix) {
array[offset(ix, iy, in, 1000, 500)] = ix + iy + in;
}
}
}
0205202
2007/05/23(水) 15:12:06ありがとうございます!
申し訳ないですが、ここからどのように数値を読み込んで、どのように値を入れたらいいでしょうか。
初歩的なところが分かってなくてすいません。
0206デフォルトの名無しさん
2007/05/23(水) 15:37:180207デフォルトの名無しさん
2007/05/23(水) 16:00:59なんだ、そのレベルか。だったら諦めろ。それが一番楽だ。
0208デフォルトの名無しさん
2007/05/23(水) 16:06:21最初から
typedef int MyElement; // 要素の型。int でも double でも好きなように。
typedef MyElement (*MyArray)[500][300];
みたいにしといて
MyArray array = malloc(1000 * sizeof(*array));
で確保すりゃ
array[999][499][299] = 0;
直感的。
0209デフォルトの名無しさん
2007/05/23(水) 16:29:440210デフォルトの名無しさん
2007/05/23(水) 18:07:570211デフォルトの名無しさん
2007/05/23(水) 18:19:57>204
0212デフォルトの名無しさん
2007/05/23(水) 18:23:050213デフォルトの名無しさん
2007/05/23(水) 21:56:59.oファイルをソースとは別の場所に出力したいのですが、
コンパイル自体は -c obj/$< のようなオプションでディレクトリobjに出力できるのですが、
リンクのときどう書けばいいか分かりません。
分かるかたいましたら教えてください。
0214デフォルトの名無しさん
2007/05/23(水) 22:11:240215デフォルトの名無しさん
2007/05/23(水) 22:18:260216デフォルトの名無しさん
2007/05/23(水) 22:51:27gnu make? bsd make? imake? nmake?
0217デフォルトの名無しさん
2007/05/23(水) 22:52:520218デフォルトの名無しさん
2007/05/23(水) 23:13:35patsubst で *.c を obj/*.o に置換しる。
0219デフォルトの名無しさん
2007/05/23(水) 23:31:43どのようにして作るのでしょうか?
0220デフォルトの名無しさん
2007/05/23(水) 23:34:33A→BとかB→Cとか?
Zの次は?
0221デフォルトの名無しさん
2007/05/23(水) 23:36:17Zは入力しない方針で
0222デフォルトの名無しさん
2007/05/23(水) 23:48:27'A' + 1, 'B' + 1でいいんじゃないの
だからchに文字が読み込まれているとしてch + 1にすればいいじゃない。
Zはそれなりに表示されるし。
0223デフォルトの名無しさん
2007/05/24(木) 00:11:05うんぬん言われるけど、このほかに方法はあるのかと俺は知りたい。
0224デフォルトの名無しさん
2007/05/24(木) 00:15:11switch(c)
{
case 'A': c='B';break;
case 'B': c='C';break;
・・・・
}
とか
0225デフォルトの名無しさん
2007/05/24(木) 00:15:5626文字くらいならアリだと思う
0226デフォルトの名無しさん
2007/05/24(木) 00:19:09実際はエラーチェックいるけど。
0227デフォルトの名無しさん
2007/05/24(木) 00:20:12int ch = getchar();
char * p = strchr(table, ch);
if (p) ch = p[1];
putchar(ch);
0228デフォルトの名無しさん
2007/05/24(木) 00:27:18どのようにしてプログラムを組めばいいのでしょうか
0229デフォルトの名無しさん
2007/05/24(木) 00:34:44'a'を'A'にする問題なのかな?
0230デフォルトの名無しさん
2007/05/24(木) 00:36:220231デフォルトの名無しさん
2007/05/24(木) 00:37:090232デフォルトの名無しさん
2007/05/24(木) 00:50:560233デフォルトの名無しさん
2007/05/24(木) 01:28:18もっと、やさしくなりたい。
俺、やなやつ?
人の気持ち無視してるのかな・・・。
すっげえ悩む。
0234デフォルトの名無しさん
2007/05/24(木) 04:14:34プログラミング初心者ですがご回答下されば幸いです。
バッファオーバーフロー(以降BOF)に関して知りたいのですがどのサイトを見ても
「BOFの仕組み」や「BOFの対策」ばかりで実際のプログラムの例がほとんどありません。
あっても、ただ単に「こうするとバッファがあふれます」程度
かなり詳しく書いていてもハードルが高くて理解できない実例ばかり
知りたいのは、単純な数行程度のプログラムでBOFを故意に行い、プログラムを書き換えるものです。
昔見たサイトで単純な仕組みでBOFを解説しているのがあったのですが探しても見当たりませんでした。
うろ覚えですが、
char str[3];
strcpy(str, "ABC...");
のような感じでstrのバッファを溢れさせ、関数を呼び出したのか、以降の変数に任意の書き込みを行ったのか
そこら辺の記憶が欠落していて思い出せないのです。
ただ、BOFにより何かしらの出力(printf||puts)を行っていたものと記憶しています。
BOFを故意に行い関数を呼び出すもしくは以降の変数を書き換えるプログラムを教えてくださいませんか?
できれば、スタックにどのように積まれていき、BOFによってどのように書き換えるのか詳しく知りたいです。
簡単な例をもとに解説してくれるWebPageがあればそちらも教えていただきたいです。
注文が多くて申し訳ありません。
コードだけでもわかれば後は自分で弄って理解したいと思います。
よろしくお願いします。
0235デフォルトの名無しさん
2007/05/24(木) 04:21:57void g() {
int a[1], n =(int)f; //キャストできないかも
a[1] = n, a[2] = n, a[3] = n, a[4] = n;
}
int main() { g(); return 0; }
0236デフォルトの名無しさん
2007/05/24(木) 04:22:33int main() {char buf[4]; gets(buf); return 0;}
必要なのはこれだけ。後はデバッガで追えばバッファオーバフローで異常動作を引き起こす様子を観察できる。
どうやってそれをやればいいか判らないようなら、諦めろ。
0237デフォルトの名無しさん
2007/05/24(木) 04:26:17もうその程度のレベルの低いレスをしているくせに、諦めろとか言っちゃっているところが
(・∀・)ニヤニヤもんだね
0238デフォルトの名無しさん
2007/05/24(木) 04:40:25「プログラミング初心者」がそんなトピックに手を出すのが大間違い。
> かなり詳しく書いていてもハードルが高くて理解できない実例ばかり
これが理解できるまでは無駄だろう。
0239デフォルトの名無しさん
2007/05/24(木) 05:02:35お前そんなのも分からんのか?やめろとか偉そうに上から物を言っちゃっている
井の中の蛙だから墓穴を掘って笑われるんだよw
0240デフォルトの名無しさん
2007/05/24(木) 05:33:320241デフォルトの名無しさん
2007/05/24(木) 05:34:08#include<stdio.h>
int main(void){
char buf1[]="this is fixed string named buf1";
char buf2[]="temp";
char buf3[]="this is fixed string named buf3";
printf("\nbuf1=%s\nbuf2=%s\nbuf3=%s\n", buf1, buf2, buf3);
printf("\n文字列を入力して下さい : ");
gets(buf2);
printf("\nbuf1=%s\nbuf2=%s\nbuf3=%s\n", buf1, buf2, buf3);
return 0;
}
↑のコードで
hello, my name is nanasi.
と入力すると…
0242デフォルトの名無しさん
2007/05/24(木) 05:37:02「HACKING: 美しき策謀」 でも読んどけ。
0243デフォルトの名無しさん
2007/05/24(木) 05:42:16>>234がより気にしてるのは、「任意の関数を呼び出す」の方。
まあそれも>>235に書いてある通りで、
>>236みたいな書き込みは何の助けにもなってないとは思うよ。
236に235が理解できるかすら疑問。
0244デフォルトの名無しさん
2007/05/24(木) 05:52:060245デフォルトの名無しさん
2007/05/24(木) 07:44:31元質の趣旨を理解できてる?
0246デフォルトの名無しさん
2007/05/24(木) 08:02:02理解するまで進める、というような趣旨か?
0247デフォルトの名無しさん
2007/05/24(木) 08:07:10/ \ ─ ─\ ___
今沖田w / ─ ─\ ⌒ ⌒ ヽ / \
/ ⌒ ⌒ ヽノ(、_, )ヽ | / ― ― \ 仕事?ありえませんねw
| ,ノ(、_, )ヽ |-=ニ=- / / ⌒ ⌒ ヽ
\ -=ニ=- /:. < | ,ノ(、_, )ヽ |
ノ \⌒ ̄ ⌒⌒〜 \ -=ニ=- /
〜⌒ ⌒ ̄⌒ ⌒ ̄ ⌒⌒〜 > <
\ /⌒ ⌒ ̄⌒ ⌒ ̄ ⌒⌒〜
―― l ‐┼― ‐┼― _l_ヾ
ー― ト― | ⌒ rー、 | |
―‐― l / ー _ノ / J
| ̄ ̄| ーヽ-〃 ヽ_ノ ‐┼―
|二二| _ヽ γ、ノ`ヽ | ⌒
|__| (_ , lノ ヽ_ノ / ー‐
0248デフォルトの名無しさん
2007/05/24(木) 08:13:15それとも無間配列を作ることは不可能なのでしょうか?
0249デフォルトの名無しさん
2007/05/24(木) 08:15:050250デフォルトの名無しさん
2007/05/24(木) 08:17:18無限と言いたい? それとも、可変長?
0251デフォルトの名無しさん
2007/05/24(木) 08:23:08Cは[]のオーバーロードが出来ないので、gtter,setter関数で実現すべし。
0252デフォルトの名無しさん
2007/05/24(木) 08:58:210253デフォルトの名無しさん
2007/05/24(木) 09:06:16それはもちろん、「VCでデバッガで」と言ってる人に対しての皮肉ですよね?
0254デフォルトの名無しさん
2007/05/24(木) 09:37:49それがわからんやつに何を説明しても無駄。
0255デフォルトの名無しさん
2007/05/24(木) 09:43:51積まれた引数の巻き戻しは 呼び出し側で整理するのか 呼び出された関数側で整理するのか
0256デフォルトの名無しさん
2007/05/24(木) 11:04:56「だったらそこから説明しろ」とか言いかねないな。
何れにしろこのスレの範疇ではないが。
0257デフォルトの名無しさん
2007/05/24(木) 13:35:32たとえばpid=1234のプロセスがまだ生きているかどうかを調べるには
どうしたらいいのでしょうか?
教えて君でスマソ
0258デフォルトの名無しさん
2007/05/24(木) 13:57:13Linux の質問な気がするよ。
0259257
2007/05/24(木) 14:04:52Linux板逝ってきます
0260234
2007/05/24(木) 14:27:43>>235
短くてわかりやすい例ですね。
mainに戻るアドレスを関数f()に書き換えているわけですね。
>>238
そうですね。もうちょっと勉強しないとだめですよね。
身の程を知れってことでしょうか。
>>241
おぉ、なるほど。buf1が書き換わってしまいますね。
溢れた値が先に詰まれた変数を書き換えているのですね。
>>242
一応買おうかと思い悩んでいるのですが、バイト代が入ったら買ってみます。
>>254
それを知りたいと思い簡単な例で解説してもらおうかと・・・。いや勉強します。
いくつか例を出して頂きましたので、あとはそこから自分で理解して行きたいと思います。
感謝いたします。
0261デフォルトの名無しさん
2007/05/24(木) 14:31:45Haskell とか勉強した事ないかい?
あれには無限リストがあるよ。
無限配列ってのはおそらく、
値をメモリに置かず、生成していくのを、
配列操作の文法で実現できるかって話じゃないかね。
C++ なら [ ] や * のオーバーロードで実現できるだろうけど、
C だと無理やね。
0262デフォルトの名無しさん
2007/05/24(木) 16:22:01int | int | int
(たとえば、 10 20 30 …)
という風に入っているのですが
これをファイルのケツまで読み込んで表示したいのですが
うまくいきません。どなたか御指導願えませんか
int main(void)
{
int x,y,z;
FILE *file;
file = fopen("test.dat","rb");
//while(fread( &x , sizeof( int ) , 1 , file )!=EOF){
while(file!=NULL){
fread(&x,sizeof(x),1,file);
fread(&y,sizeof(y),1,file);
fread(&z,sizeof(z),1,file);
printf("%d %d %d\n", x, y, z);
}
fclose(file);
return 0;
}
これには 1 2 3 4 5 6 7 8 9 という値で試しています
0263デフォルトの名無しさん
2007/05/24(木) 16:29:42メモ帳で test.dat を開くと 「1 2 3 4 3 5 6 7 8 9」 と見える→それテキストじゃ
2) sizeof(int) とバイナリファイルが想定している整数が同じ大きさか?
3) エンディアンの規定はどうなっているのか?
<><><>
先に バイナリデータを作るプログラムを作って そのファイルを読み込むテストしてみたら?
→それでうまくいくのなら、2) 3) が怪しい
0264デフォルトの名無しさん
2007/05/24(木) 16:31:350265デフォルトの名無しさん
2007/05/24(木) 16:34:29int main(void)
{
int buf[] = { 1,2,3,4,5,6,7,8,9 };
FILE *file;
file = fopen("test.dat","wb");
fwrite(buf,sizeof(buf),1,file);
fclose(file);
return 0;
}
これでデータを生成してから読み込んでいます
上のソースで読み込んだときは
1 2 3
4 5 6
7 8 9
7 8 9
7 8 9
…終わらず 、です
どうやったら 7 8 9で終えられるのか教えてください
0266デフォルトの名無しさん
2007/05/24(木) 16:37:07while (file!=NULL) で回してるからそーなる。
freadの戻り値をチェックするんだー
0267デフォルトの名無しさん
2007/05/24(木) 16:38:21累積加算結果が50を超えた時にループを抜けると言った処理をしたいのですが、どうすればいいのでしょうか?
因みに配列やポインタは使わないものし、ループ関数はwhileを使うものとします
実行結果
1+2+3+4+5+6+7+8+9+10=55
0268デフォルトの名無しさん
2007/05/24(木) 16:40:41近いことは出来ている気がするのですが(´・ω・`)
#include <stdio.h>
main () {
int num0;
num0 = 0;
while (num0 < 50) {
num0 = num0++;
printf ("%d+",num0); // 1+2+3...
if (num0 > 50) printf ("=%d",num0);
}
return 0;
}
0269デフォルトの名無しさん
2007/05/24(木) 16:44:54# それまでの総和を公式で求めるなら それはそれで有りだが
0270デフォルトの名無しさん
2007/05/24(木) 16:45:51調べているとEOFが使え無そうなのでそうしていたのですが
freadで読み込んだ値が○なら終了という風にすればよいのでしょうか
その終了の値はバイナリの場合は何が入るのでしょうか
0271デフォルトの名無しさん
2007/05/24(木) 16:48:56そういう時、(ファイル形式がどうなってようが) fread について調べる。
0272デフォルトの名無しさん
2007/05/24(木) 16:49:30このキモイインデントはどっかで見たな。w
まぁそれはおいといて。
#include <stdio.h>
int main(void) {
int num0=0, i=0;
while (num0 < 50) {
++i;
num0 += i;
if ( num0<50 ) { printf ("%d+",i); } else { printf ("%d",i); }
}
printf ("=%d",num0);
return 0;
}
これでいいんじゃね?
0273デフォルトの名無しさん
2007/05/24(木) 16:59:09どうやったらこんなインデントで書けるんだよww
0274デフォルトの名無しさん
2007/05/24(木) 17:02:420275デフォルトの名無しさん
2007/05/24(木) 17:03:09freadの確認をしましたら「読み込みデータの数よりも小さい数、または0を返す」とありました
そこで
>>262のソースにif(x==0) break;
という風にしたのですが変わらずです…助けてください
0276デフォルトの名無しさん
2007/05/24(木) 17:04:57最初はnum0とnum1に分けてやってたのですが
上手くいかなかったのでnum0だけにしてみたんですけど・・・
やはり二つ必要でしたかorz
>>272
おお、動きました!
表示を全部ifに投げると言う発想は無かったです・・・
>>272-273
余り他人のソースを見たことが無いものでして・・・
取り敢えず{があればインデントって感じなのです。。。
私のソースは、そんなに可笑しいですか?
(センスは良く可笑しいと言われますが・・・)
0277デフォルトの名無しさん
2007/05/24(木) 17:06:28ちゃんと fread の仕様を読め。
"関数の戻り値" をチェックするわけだから (引数の書き換え値をチェックするのではない)
if (fread(&x, sizeof(x), 1, file) != 1) break;
if (fread(&y, sizeof(y), 1, file) != 1) break;
if (fread(&z, sizeof(z), 1, file) != 1) break;
こうなる
0278デフォルトの名無しさん
2007/05/24(木) 17:11:10関数の戻り値ですね…勘違いしていました
while(fread( &x , sizeof( int ) , 1 , file )!=NULL){
//while(file!=NULL){
//fread(&x,sizeof(x),1,file);
fread(&y,sizeof(y),1,file);
fread(&z,sizeof(z),1,file);
printf("%d %d %d\n", x, y, z);
}
でも出来ました。
ありがとうございました
0279デフォルトの名無しさん
2007/05/24(木) 17:12:19xのサイズのものを1個読んで、結果は?
読めたら1、読めなかったら0だろ。
もっとでかい数で指定した場合でも、その数未満なら最後まで読んだことになる。
0280デフォルトの名無しさん
2007/05/24(木) 17:29:19あるアンケートの結果を配列Kに集計したい
アンケートの回答は0,1,2,3,4の数字であり、Nに入力されるものとする
流れ図は以下の通りである
http://www.imgup.org/iup385775.png
これってC言語化できると思いますか?
僕はフローそのものに間違いがある気がするんですが
というかNを入力以降のフローの意図することが理解できません
(1 += K(N)って何がしたいんだろうか・・・
しかも表示するわけでも、ファイルに書き出すわけでもなくEND)
0281デフォルトの名無しさん
2007/05/24(木) 17:33:131 += K(N) は明らかに k[N] += 1 の誤植だが、
入力が 0, 1, 2, 3, 4 なのに N != 1 ってのは明らかに変。
出力に関しては、そのフローのさらに後でするだけだろう。
これは集計処理のフローなだけっしょ。
0282デフォルトの名無しさん
2007/05/24(木) 17:37:12k[n] += 1 としたいんだろ。
N != 1はバグだろうけど、そのまま書けない事も無いw
出力が無くたってプログラムは書ける。
0283デフォルトの名無しさん
2007/05/24(木) 17:39:50アンケートで (1) を選ぶと集計が止まるシステムの完成!
まさに仕様ミスだな
0284デフォルトの名無しさん
2007/05/24(木) 17:52:35上手くいきません、と言うか自分で見ても明らかに可笑しい箇所が解ります
解るんですが、解決策が解りません
(配列の概念は大まかには理解してます)
#include <stdio.h>
#include <conio.h>
main () {
int k; // kを配列化出来ない(k[i]ないしk[n]ないしk[i||n]は無理)
int i,n;
for (i = 0; i < 5; i++)
k[i] = 0;
// 暫定的に9を採用
for (n = getche (); n != 9; k[n] + 1); // ココが何もかも可笑しい
return 0;
}
0285デフォルトの名無しさん
2007/05/24(木) 18:05:37あとfor文でまとめようとしなけりゃいい。
0286デフォルトの名無しさん
2007/05/24(木) 18:14:12'0' を引かないとダメやね。
というか、scanf でも使う問題ではないのか?
0287デフォルトの名無しさん
2007/05/24(木) 18:15:10というか、k[n]のnに数値を代入し、k[n]に足し込んで行くのに
k[i]が何の為にあるのかがわからないんですが・・・(´・ω・`)
main () {
int k[5]; // 初期化式の使用は題意に反する
int i,n;
for (i = 0; i < 5; i++) // 配列初期化
k[i] = 0;
while (n != 9) {
/*
!足し込み
入力された値をnに入れる
k[n] + 1とすることで入力された値に足しこんで行く
*/
n = getche ()
k[n] + 1;
}
return 0;
}
0288デフォルトの名無しさん
2007/05/24(木) 18:17:17scanfだと改行入るから良くないんじゃないかなー・・・なんて思ったんですが
因みに>>280は問題ですらない(流れ図と説明みたいな感じ)ので、特にこれといった指定はありませんが
余り複雑なものになると、僕自身が理解できなく(ry
0289デフォルトの名無しさん
2007/05/24(木) 18:18:070290デフォルトの名無しさん
2007/05/24(木) 18:18:140291デフォルトの名無しさん
2007/05/24(木) 18:18:420292デフォルトの名無しさん
2007/05/24(木) 18:19:11ちょ i=n っしょw
0293デフォルトの名無しさん
2007/05/24(木) 18:19:28i == n の時、だな。
0294デフォルトの名無しさん
2007/05/24(木) 18:21:00無限ループにして、入力後にif 文で break でどうか。
0295デフォルトの名無しさん
2007/05/24(木) 18:21:000296デフォルトの名無しさん
2007/05/24(木) 18:22:45だな。
0297デフォルトの名無しさん
2007/05/24(木) 18:27:20でも、これが理解できないと授業についていけないorz
#include <stdio.h>
main () {
int k[5]; // 初期化式の使用は題意に反する
int i,n;
for (i = 0; i < 5; i++)
k[i] = 0;
do {
scanf ("%d",n);
if (i == n)
k[n] += 1;
} while (k[n] != 9);
return 0;
}
0298デフォルトの名無しさん
2007/05/24(木) 18:27:520299デフォルトの名無しさん
2007/05/24(木) 18:29:33変数の中に値が入ってるのは理解できてるのか?
0300デフォルトの名無しさん
2007/05/24(木) 18:32:360301デフォルトの名無しさん
2007/05/24(木) 18:34:35int k[5];で領域が5つ確保され
for (i = 0; i < 5; i++) k[i] = 0;でk[0]〜k[4]に0が代入される
(k[0]、k[1]、k[2]、k[3]、k[4]の中の値は全て0)
scanf ("%d",n);でnにint型の値が代入される
} while (k[n] != 9);k[n]が真ならば継続(後判定)
と言うところまでは理解できてます
if (i == n) k[n] += 1; でnがiならば k[n]は+1される・・・ですよね?
iは0ですね
つまり0を入力した時に、k[n]は+1されるんでしょうか??
0302デフォルトの名無しさん
2007/05/24(木) 18:41:05n はアンケートの 0, 1, 2, 3, 4 の数値を入力させたもので、
k はそれぞれの数値に対する票数でしょ。
それが分かれば、もうちょい分かるんじゃね?
0303デフォルトの名無しさん
2007/05/24(木) 18:41:07されません
scanf("%d", &n);
>if(i==n) k[n] += 1;
なぜそこで i と n を比較しなければいけない衝動にかられたのかと
0304デフォルトの名無しさん
2007/05/24(木) 18:43:05ここってi == 4 になっちゃうよね?
てことはなんかへんじゃない?
俺も初心者なんでちがかったらメンゴ
0305デフォルトの名無しさん
2007/05/24(木) 18:44:17問題は、nが0〜4以外の場合と、9の場合。
1を足す前に9かどうか比較すればいい。
5以上なら抜ける、でもいい気がするがその辺は
フローチャートがなおされたら即座に反映できるようにしておけ。
0306デフォルトの名無しさん
2007/05/24(木) 18:46:30for 抜けた後の i の値は 5 になるお
0307デフォルトの名無しさん
2007/05/24(木) 18:49:57Oh!確かにそうでしたorz
0308デフォルトの名無しさん
2007/05/24(木) 18:50:07余り解ってないかもです・・・
ただ、配列って言うのは連続した変数みたいなものですよね?
題意に反する書き方で書くなら、配列を使って表現できるのですが
これだとまるで別物ですね
(数が多くなると不利だし、配列の特長を微塵にも生かせていない、ただの変数となんら変わりが無い)
http://www.borujoa.org/upload/source/upload11805.c
>>303
>>293でi == n の時とあったので・・・
>>304,306
>>305
それはif breakですか?
0309デフォルトの名無しさん
2007/05/24(木) 18:50:27値を返すというのはどこに返しているんですか?
0310デフォルトの名無しさん
2007/05/24(木) 18:56:58k[i] と k[n] は i == n の時に同じ、と言っただけなのだが・・・。
>for(i = 0; i < 5; i++) k[i] = 0;でk[0]〜k[4]に0が代入される
>(k[0]、k[1]、k[2]、k[3]、k[4]の中の値は全て0)
これが何でこうなるかは分かってる?
>>309
main の話か?
0311デフォルトの名無しさん
2007/05/24(木) 19:00:20mainです
0312デフォルトの名無しさん
2007/05/24(木) 19:00:200313デフォルトの名無しさん
2007/05/24(木) 19:03:13retrun(0); とかミスしてもコンパイル通っちゃうから。
0314デフォルトの名無しさん
2007/05/24(木) 19:04:08>k[i] と k[n] は i == n の時に同じ
済みません、言っていることが良くわかりません(´・ω・`)
if (i == n) k[i] = k[n];???
>これが何でこうなるかは分かってる?
forの中身が初期化式;ループ式?;カウンタであり
初期化式がi = 0なので、iには0が代入されます
つまりk[i]のiに0が入るということです
そしてk[0]になり、k[0] = 0;となります
そしてiは0なのでi < 5は真(1)でありループします
i++がカウンタなのでiにはは1が代入され、k[1]になり
k[0] = 0;となる
を繰り返し
iが5に成る時
i < 5は偽(0)となるので、forを抜けます
と理解しています
0315デフォルトの名無しさん
2007/05/24(木) 19:05:38そしてiは0なのでi < 5は真(1)でありループします
i++がカウンタなのでiにはは1が代入され、k[1]になり
k[1] = 0;となる
0316デフォルトの名無しさん
2007/05/24(木) 19:05:42それが分かってるのなら、
k[n] += 1; が何をするものか、
何をしたいものなのかは分かると思うんだけど。
0317デフォルトの名無しさん
2007/05/24(木) 19:06:55「i と n が等しい値だったら
k[i] で参照しているところと k[n] で参照しているところは同じ」
問題のアルゴリズムについての話ではない。 配列の一般論
0318デフォルトの名無しさん
2007/05/24(木) 19:07:25>済みません、言っていることが良くわかりません(´・ω・`)
例えば i が 2 で n が 2 なら、
k[i] も k[n] も k[2] になるだろ。
それだけの話。
0319デフォルトの名無しさん
2007/05/24(木) 19:07:25プロセスAが内部で別のプロセスBを呼んだときに戻り値として受け取ったりする
0320デフォルトの名無しさん
2007/05/24(木) 19:12:00等しい値ならば、何故iとnを別ける必要があるのでしょうか?
また、k[i]で参照している場所とk[n]で参照している場所は同じとありますが
iとnは別の文字なのに、どうして同じ場所を参照させることが出来るのでしょうか?
0321デフォルトの名無しさん
2007/05/24(木) 19:13:59> 等しい値ならば、何故iとnを別ける必要があるのでしょうか?
別に i を入力に使いまわしても良いが、
フローがそう指示してるからでしょ?
>iとnは別の文字なのに、どうして同じ場所を参照させることが出来るのでしょうか?
この認識から外れられない以上
配列とその中身へのアクセスの仕方が理解できないと思われる
0322デフォルトの名無しさん
2007/05/24(木) 19:14:07別の文字だったら何か困る事でもあるのか?
値が同じなら、そんな事どうだっていいじゃん。
0323デフォルトの名無しさん
2007/05/24(木) 19:18:30確かにフローの指示だからというのはあるのですが
別けているのには、何か特別な意味があるのかな?と思いましたので
(別けることによるメリットなど)
>この認識から外れられない以上
つまり添え字には意味がないと言うことでしょうか?
自分が見るC言語サイトや、参考書、教本にも、添え字についての具体的な説明が一切無いので・・・
(これが添え字、と書いている程度)
>>322
混乱してきませんか?
0324デフォルトの名無しさん
2007/05/24(木) 19:19:23ありがとうございました。
それで、main内のreturnは必要あるんですか?
0325デフォルトの名無しさん
2007/05/24(木) 19:21:10戻り値の型が int である以上 return は必要、というのが C の話。
C++ だと return 0; なら省略可能。
0326デフォルトの名無しさん
2007/05/24(木) 19:22:17混乱してきません。
変数の中に入ってる値に注目して考えてみ。
0327デフォルトの名無しさん
2007/05/24(木) 19:22:52>>319
0328デフォルトの名無しさん
2007/05/24(木) 19:23:40異常終了の場合は0以外の何かの値を返す。
0329デフォルトの名無しさん
2007/05/24(木) 19:25:26添え字に使う「変数名」に意味はない。 (歴史的に i j k x y は多用されるよねー ってだけ)
その「添え字になった変数の値」のみが重要
0330デフォルトの名無しさん
2007/05/24(木) 19:26:08後で確認するのに便利、てくらいかと
最初のうちは深く考えずに中身に凝ればいいんじゃないかな
0331デフォルトの名無しさん
2007/05/24(木) 19:26:28余り良くわかりませんが
例えば
hensu[a]
hensu[b]
hensu[c]
は全て同一のアドレスを参照していると言うことでしょうか?
0332デフォルトの名無しさん
2007/05/24(木) 19:27:120333デフォルトの名無しさん
2007/05/24(木) 19:28:37b=1;
hensu[a];//hensu[1];
hensu[b];//hensu[1];
0334デフォルトの名無しさん
2007/05/24(木) 19:30:02a や b や c の中に入ってる値による。
0335デフォルトの名無しさん
2007/05/24(木) 19:30:52そんなんじゃ k[i + 1] とか k[2 * 5] とか k[n / 2] とか理解できんぞ。
0336デフォルトの名無しさん
2007/05/24(木) 19:30:58なるほど、そういうことですか
これでやっと、iとnが同一と言う理屈が理解できました
こんな馬鹿に長々教えてくださり、本当に有り難うございました
0337デフォルトの名無しさん
2007/05/24(木) 19:31:00わかりやすく教えてくれてありがとう、助かりました
0338デフォルトの名無しさん
2007/05/24(木) 19:33:19k[i +1]は、i = 5ならば、k[6]ということで
k[2 * 5]は、k[7]
k[n / 2]は、n = 8ならば、k[4]ということでしょうか?
0339デフォルトの名無しさん
2007/05/24(木) 19:33:58k[10]
0340デフォルトの名無しさん
2007/05/24(木) 19:36:03「復改が必要な場合は、全てにおいてputcharを使って改行しなさい」
って指定されてるんですが、\n以外に何かあるのでしょうか
0341デフォルトの名無しさん
2007/05/24(木) 19:36:132つ目は + と見間違えただけだろうと思っとく。
それ意外は問題ない。
これで課題も解けるね。
0342デフォルトの名無しさん
2007/05/24(木) 19:36:31素で掛け算と足し算、間違えました
恥ずかしいorz。。。
0343デフォルトの名無しさん
2007/05/24(木) 19:36:57質問の意味が分からん。
0344デフォルトの名無しさん
2007/05/24(木) 19:38:11有り難うございました
良い勉強になりました
0345デフォルトの名無しさん
2007/05/24(木) 19:40:47だったら\r\n。
復帰が\rで改行が\n。
0346デフォルトの名無しさん
2007/05/24(木) 19:43:41んなもん OS による
0347デフォルトの名無しさん
2007/05/24(木) 19:49:54それを OS に渡す時に \r になるか \r\n になるか \n のままなのかは OS 次第。
0348デフォルトの名無しさん
2007/05/24(木) 20:19:05putchar("%r");
ではエラーがでました、ご教授して頂ければ幸いです
0349デフォルトの名無しさん
2007/05/24(木) 20:22:02どう誘導していいのか分からない。
とりあえず putchar の仕様くらいヘルプでも man でもいいから調べとけ。
0350デフォルトの名無しさん
2007/05/24(木) 20:23:52atoiのように文字を整数型に直してくれる関数はありますか?
0351デフォルトの名無しさん
2007/05/24(木) 20:26:48その文字から'0'を引け
0352デフォルトの名無しさん
2007/05/24(木) 20:28:18atoi は普通に使えばエラーの出るはずのない関数だが・・・。
数字がなければ 0 を返す。
エラーになるのって、渡しちゃいけないアドレスを渡した時くらいだぜ。
0353デフォルトの名無しさん
2007/05/24(木) 20:29:301文字しか対応できないじゃん
0354デフォルトの名無しさん
2007/05/24(木) 20:30:120355デフォルトの名無しさん
2007/05/24(木) 20:30:23'3'だけを指定して整数に直したいのですがatoiでどのように指定させればいいのかちょっと分からないのです
0356デフォルトの名無しさん
2007/05/24(木) 20:31:23>>351 でファイナルアンサー。
0357デフォルトの名無しさん
2007/05/24(木) 20:34:090358デフォルトの名無しさん
2007/05/24(木) 20:34:32int num = foo[2] - '0'; /* 3 の書かれてる場所な */
0359デフォルトの名無しさん
2007/05/24(木) 20:37:19putchar(c);
でも改行されなかった
0360デフォルトの名無しさん
2007/05/24(木) 20:37:33勉強になりました
参考にしていろいろ試してみたいと思います
0361デフォルトの名無しさん
2007/05/24(木) 20:39:23== だからじゃね
0362デフォルトの名無しさん
2007/05/24(木) 20:40:200363デフォルトの名無しさん
2007/05/24(木) 20:40:25...........
0364デフォルトの名無しさん
2007/05/24(木) 20:44:28ってやればいいのに
0365デフォルトの名無しさん
2007/05/24(木) 20:44:40putchar(c);//cに'\n'が入ってないので当然改行されない。
putchar("\r");//文字列じゃだめ。文字を渡す。
putchar('\n');//OK
0366デフォルトの名無しさん
2007/05/24(木) 20:46:450367デフォルトの名無しさん
2007/05/24(木) 20:48:43見間違えた。
奴をみくびっていたようだ。
0368デフォルトの名無しさん
2007/05/24(木) 20:51:230369デフォルトの名無しさん
2007/05/24(木) 20:56:120370デフォルトの名無しさん
2007/05/24(木) 21:01:58資格は足の裏の米粒っていわれるけど、、ソフトウェア開発技術者の資格とればなんとかなる?
0371デフォルトの名無しさん
2007/05/24(木) 21:06:24高校生の俺でも持ってるっす…
0372デフォルトの名無しさん
2007/05/24(木) 21:10:48現役と比べて2年のブランクまでなら新卒扱いになる。
今大学1回なら今から必死で勉強して国立にでも入って
大学内で必死に勉強すれば入れるよ。3回以上ならオワタだけど。
0373デフォルトの名無しさん
2007/05/24(木) 21:26:340374デフォルトの名無しさん
2007/05/24(木) 21:31:500375デフォルトの名無しさん
2007/05/24(木) 21:34:400376デフォルトの名無しさん
2007/05/24(木) 21:37:33その中で、色々覚える事もあるだろう。
0377デフォルトの名無しさん
2007/05/24(木) 21:43:470378デフォルトの名無しさん
2007/05/24(木) 21:47:37アドバイスできるほどプログラム知ってる人じゃないけど
とにかくなんか作ってみる事をおすすめします。
僕は高校入った頃にとある開発プロジェクトに混ぜてもらって
そこで色々学んだので。これは稀有なケースだと思うけど…
連結リストやハフマン符号化とかのアルゴリズムも人のソースから学んだっす
(読んだ時は名前知らなかったからデータチェインとか自分で名づけてた)。
とにかく何か作ってみて何度も壁にぶちあたって乗り越えてを繰り返すと
いつの間にかある程度プログラムの構造やコンピュータのアーキテクチャに詳しくなってる筈だと思います。
そこから本読んで正しい知識得て間違った知識を排除すれば良い感じになるかと。
あとソフ開だけ取りたいならこんな事しなくても専用の勉強するだけで余裕だと思います。
僕でも試験1日前に対策本ざっと眺めて過去問やっただけで取れちゃったので。
ここまで書いてて思ったけど完全にスレ違いですね。でも勿体無いから書き込んじゃう。
0379デフォルトの名無しさん
2007/05/24(木) 21:53:430380デフォルトの名無しさん
2007/05/24(木) 21:57:510381デフォルトの名無しさん
2007/05/24(木) 23:40:36で、今なにしてんの?
0382デフォルトの名無しさん
2007/05/25(金) 00:01:090383デフォルトの名無しさん
2007/05/25(金) 00:23:21平均と体重とBMIをだせってプログラムを組んでるんですけどまったくわからない・・・
なにかアドバイスになるものありますか?お願いします
0384デフォルトの名無しさん
2007/05/25(金) 00:24:030385デフォルトの名無しさん
2007/05/25(金) 00:39:540386デフォルトの名無しさん
2007/05/25(金) 00:46:100387デフォルトの名無しさん
2007/05/25(金) 01:11:44配列array[]があって、while文でarray[]の全ての要素を表示するにはどうしたらいいでしょう?
int i=0;
while(array) {
printf("%d\n", array[i]);
i++;
}
これじゃダメですよね。
0388デフォルトの名無しさん
2007/05/25(金) 01:14:02高校す。今年卒業す。
0389デフォルトの名無しさん
2007/05/25(金) 01:15:58int i=0, size;
size = sizeof a / sizeof a[0];
while(i<size) {
printf("%d\n", array[i]);
i++;
}
0390デフォルトの名無しさん
2007/05/25(金) 01:18:19int array[AMAX];
とする場合、
int i=0;
while( i<AMAX ) {
printf("%d\n", array[i]);
i++;
}
0391デフォルトの名無しさん
2007/05/25(金) 01:23:59>>390
ありがとう、目から鱗。
0392デフォルトの名無しさん
2007/05/25(金) 01:47:48教えてる人の気が知れないよ。
0393デフォルトの名無しさん
2007/05/25(金) 08:06:22この計算するプログラムはどうすればいいですか?
forの中身が分からない
0394デフォルトの名無しさん
2007/05/25(金) 08:10:16sum = 0;
for(i=1;i<=10;i++)
sum += i;
0395デフォルトの名無しさん
2007/05/25(金) 08:11:210396デフォルトの名無しさん
2007/05/25(金) 08:15:38お早いレスありがとう(・ω・)
0397デフォルトの名無しさん
2007/05/25(金) 09:58:40sum = 0;
for(i=1;i<=10;i++)
sum = (1+10)*10/2;
0398デフォルトの名無しさん
2007/05/25(金) 10:13:31n=10;
for(i=1;i<=n;i++)
if(n%2) sum=n*((n+1)/2);
else sum=(n/2)*(n+1);
0399デフォルトの名無しさん
2007/05/25(金) 12:18:060400デフォルトの名無しさん
2007/05/25(金) 12:25:55丸投げは宿題スレへどうぞ。
0401デフォルトの名無しさん
2007/05/25(金) 13:12:540402デフォルトの名無しさん
2007/05/25(金) 14:03:39つ[ マザーボードごと交換が必要です ]
0403デフォルトの名無しさん
2007/05/25(金) 14:07:32ttp://www.cb.uu.se/~tc18/code_data_set/3D_images.html
ここのrawデータを使いたいのですが仕様は
ttp://www.cb.uu.se/~tc18/code_data_set/Code/Libvol/man/volformat-man.html
ここのページにある
.raw files : all data is written in binary :
| int SizeX | int SizeY | int SizeZ |\n
| 3D raw data [...] |
The 3D raw data is just the dump of the matrix of voxel.
In fact, raw data format depends of the machine where it is generated. So it's not very portable.
とあってint型でバイナリを3つ取るソースを書きました。
raw.gzを落としてきて、まず、解凍しようとしたのですが、アーカイブじゃないと言われ
そのまま読み込んだら、明らかにおかしい値が出てきました
どなたか、バイナリに詳しい方、お教え願えませんか
0404デフォルトの名無しさん
2007/05/25(金) 14:12:25#include <stdio.h>
int main(void)
{
int x,y,z;
char inFileName[256],outFileName[256];
FILE *file, *file2;
printf("Input Bynary Data >");
scanf("%s",inFileName);
if((file = fopen(inFileName,"rb")) == NULL) {
printf("入力ファイル(%s)をオープンできない。\n",inFileName);
return 0;
}
printf("Out put File Name >");
scanf("%s",outFileName);
file2=fopen(outFileName,"w");
while(1){
if (fread(&x, sizeof(int), 1, file) != 1) break;
if (fread(&y, sizeof(int), 1, file) != 1) break;
if (fread(&z, sizeof(int), 1, file) != 1) break;
//printf("%d %d %d\n", x, y, z);
fprintf(file2,"%d %d %d\n", x, y, z);
}
fclose(file);
fclose(file2);
return 0;
}
0405デフォルトの名無しさん
2007/05/25(金) 14:19:17まずはバイナリエディタで調べてみてはどうか
0406デフォルトの名無しさん
2007/05/25(金) 14:29:071 2 3〜7 8 9 などの値を入れてみたのですが…変な値が出てきて。
int main(void)
{
int buf[] = { 1,2,3,4,5,6,7,8,9 };
FILE *file;
file = fopen("test.dat","wb");
fwrite(buf,sizeof(buf),1,file);
fclose(file);
return 0;
}
これで生成したデータは読み込んで、そのまま表示しているのですが。
1 2 3
4 5 6
7 8 9
| int SizeX | int SizeY | int SizeZ |\n
| 3D raw data [...] |
この形式が 改行まで含んでいるのか、それとも含んでいないのか
あるいは
1行目 Xのサイズ Yのサイズ Zのサイズ|改行
2行目以降 xyzxyzxyzxyz…xyz
それともgzでやはり圧縮されておかしくなってるのか…
どうにも確認の方法がなくて…
0407デフォルトの名無しさん
2007/05/25(金) 14:34:52ちょっとみてみたけど、そんな仕様にはなってないみたいだよ
それと、外からファイルを持ってくるのならエンディアンに注意な。
0408デフォルトの名無しさん
2007/05/25(金) 14:41:010409デフォルトの名無しさん
2007/05/25(金) 14:45:20バイナリで開いたところ、始めのほとんどが0でおかしいな…と
>>408コンソールに渡してgzipで解凍しようとしたのですが
gzip形式では無いとエラーがでてしまって
0410デフォルトの名無しさん
2007/05/25(金) 14:59:38確かに落ちてきた段階で展開されているね。
例えば、aneurism.rawとかskull.rawで256*256*256→16777216バイトでサイズ的にもいいみたい。
後は単純に、グレイ256諧調のxyデータが256枚z方向に並んでるイメージっぽい。
例えばIrfanViewならrawデータ用プラグインを使って幅256、高さ65536、8bppで見える。
#このままでも歯並びがよく判るのさw
0411デフォルトの名無しさん
2007/05/25(金) 15:12:31さっそく試してみます!
0412410
2007/05/25(金) 15:26:50#って、ここまで全然Cに関係してこないや。
0413和田っちあっちゃん
2007/05/25(金) 15:30:04・ビリヤード台がおいてある
・台の左下端の座標は(0,0)、右上端の座標は(2,1)とする
・位置(x0、y0)に手玉
・手玉の初速度(v0x,v0y)
・手玉の位置、初速度はscanfをつかって入力する
<問題>
・手玉はどこに衝突するか?
・衝突位置の座標を表示する
・ポケットにおちることは考えなくてもよい
・20回のバンクを考慮して21カ所解答
お願いします!!
0414デフォルトの名無しさん
2007/05/25(金) 15:33:30丸投げは宿題スレへ。
0415デフォルトの名無しさん
2007/05/25(金) 15:41:28ありがとうございます!見られました!
ここから数値データに…もっていければ一番なのですが
もう少し頑張ります
0416デフォルトの名無しさん
2007/05/25(金) 15:42:04#手玉と的玉でImaginaryBallなんて話が出てきたりすると面白いのだが。
0417デフォルトの名無しさん
2007/05/25(金) 15:44:27ものすごーく横着したければ、IrfanViewでPGM(勿論Ascii)で保存すれば数値の書かれたテキストになるw
0418デフォルトの名無しさん
2007/05/25(金) 16:24:48ようやく先に進むことが出来そうです。本当にありがとうございました!
0419デフォルトの名無しさん
2007/05/25(金) 19:37:57main()
{
int a;
int f;
int i;
int t;
printf("aaaaa\n");
scanf("%d",&f);
for(t=0;t==1;t++){
if(f==2){i++;}
else{a++;}
}
f=0;
printf("AAAAA\n");
scanf("%d",&f);
for(t=1;t==2;t++){
if(f==1){i++;}
else{a++;}
}
printf("%d個\n",a);
printf("%d個\n",i);
return;
}
もう何やってるのかもわからない
0420デフォルトの名無しさん
2007/05/26(土) 01:27:28aとiに値が入ってない
forループはどちらも実行されない
なにがしたいのかさっぱりわからない
0421デフォルトの名無しさん
2007/05/27(日) 09:54:12スレッドAとスレッドBにおいて、同時にtest()という関数を呼び出したらどうなるのでしょうか?
普通にtest()という関数がそれぞれのスレッドで独立して並列処理されるだけでしょうか?
0422デフォルトの名無しさん
2007/05/27(日) 10:11:15基本はそう。内部に静的変数があるとぶつかるので要注意。
#その点では、標準関数のうちのいくつかも使えない。
0423デフォルトの名無しさん
2007/05/27(日) 10:20:360424デフォルトの名無しさん
2007/05/27(日) 10:27:34リエントラントとか再入可能という言葉も調べてね。
0425421
2007/05/27(日) 11:47:21排他処理をする、それらの変数を使用していない場合は特に何もする必要はないという事ですかね?
あと、その関数自体を全て排他処理したらプログラムがフリーズしてしまいました。
なんか排他処理を色んなところで使ってると時々プログラムが応答なしになります。
排他処理を細かく分けてちょくちょくやれば正常に動いたり・・・
一体何が起きているのでしょうか?
0426デフォルトの名無しさん
2007/05/27(日) 11:56:18別のスレッドが使ってるスタックは当然ながら別のもの、といえばわかるかな。
複数のオブジェクトに同時に排他かけるとデッドロックを起こす場合がある。
0427デフォルトの名無しさん
2007/05/27(日) 12:16:59グローバル変数にしても静的変数にしても同じだけれど、単に衝突を避けるだけではダメかも知れないよ。
例えば、strtok()のように一回目の呼び出しでセットして二回目以降でそれを利用するような場合、
それを静的変数で実装していたら読み書きを排他するだけではどっちみちまともに動かない。
0428デフォルトの名無しさん
2007/05/27(日) 16:48:10p = 0;
printf("元のアドレス = %x\n", p);
printf("1を加えた後のアドレス = %x\n", ++p);
printf("1を加えた後のアドレス = %x\n", ++p);
printf("1を加えた後のアドレス = %x\n", ++p);
pのアドレスを0で初期化してアドレスの変化を見たのですが、出力結果が
元のアドレス = 0
1を加えた後のアドレス = 8
1を加えた後のアドレス = 10
1を加えた後のアドレス = 18
のようになりました。double型のサイズは8なのでアドレスが8ずつ増えたりすればまだ理解できるのですが、
なぜ+8→+2→+8→+2・・・のような不規則な変化をするのでしょうか?
0429428
2007/05/27(日) 16:49:41何やってるんだオレは・・・
お騒がせしました
0430デフォルトの名無しさん
2007/05/27(日) 16:59:38オブジェクトってのは変数とか関数の事でしょうか?前提知識が少なくてすみません。
デッドロックについて調べたのですが、具体的にどんな状況で起こるかが分かりませんでした。
スレッドAでグローバル変数X、Yに対して X++; Y++; という操作を、
スレッドBで Y++; X++; という操作をミューテックスで排他制御をした場合を考えたとき、
スレッドAでXにアクセスした瞬間に、スレッドBがYにアクセスした時に、お互いの終了待ちを待つ
デッドロックが起こるのでしょうか?
私の感覚だと、スレッドAがXにアクセスする直前にWaitForSingleObject()を行った時点で、
AがReleaseMutex()をするまでスレッドBは変数Yにすらアクセス出来ない感じなのですが。
スレッドA
WaitForSingleObject()
X++;
Y++;
ReleaseMutex()
スレッドB
WaitForSingleObject() //スレッドAがReleaseMutex()するまでココで待機
X++;
Y++;
ReleaseMutex()
>>427
strtok()って便利そうな関数があるんですねw
これと排他制御を組み合わせるとどうなるか、考えるにはちょっとまだ俺の頭が足りないようです・・・
0431デフォルトの名無しさん
2007/05/27(日) 17:18:48デッドロックっていうのは、2つのプロセスorスレッド(それぞれをP(A), P(B)とする)が
ある資源(変数でもいいし、ファイルとかでもいい。R(A), R(B)とする)を互いに取り合って止まる状態
具体的には、P(A)・P(B)は両方ともR(A), R(B)を必要とし、かつ両方の資源を排他的かつ同時に利用できないとダメだとする
ここでP(A)がR(A)を、P(B)がR(B)を排他利用出来る状態になったとする。
すると処理を完了するためにP(A)はR(B)を、P(B)はR(A)をそれぞれ要求する訳だけど
それは既に相手に排他利用されているので確保できず、解放されるのを待つしかなくなる
しかし両方ともそれをやり始めるので結局いつまで経っても終わらずそこでストップ
これがデッドロック。並列処理で他にも問題になるものにスタベーションってのもあるがそれは全くの別物
あと、strtok()はmanpageにも書かれているようにスレッドセーフではないから
基本的にマルチスレッドで使うと変な挙動をする
排他制御でどうこうするより大人しくReentrant版を使うのが吉
0432デフォルトの名無しさん
2007/05/27(日) 17:29:37strtok()はマルチスレッドから使っちゃダメな例として挙げただけだよ。
>>428
ポインタ管理に癖のある環境もあるから、実際に意味のある変数を指さない値を代入するのは危険(或いは好ましくない)よ。
#0(所謂NULL)は例外。
たまたま0x8, 0x10, 0x18になっただけで、そこに何か置ける訳でもないし。
0433デフォルトの名無しさん
2007/05/27(日) 17:31:57つまり、構造的に排他処理の入れ子状態になってる時に起こるって事でしょうか?
先ほどの私の例だと特に問題はなく、
スレッドA
WaitForSingleObject(1)
X++;
WaitForSingleObject(2)
Y++;
ReleaseMutex(2)
ReleaseMutex(1)
スレッドB
WaitForSingleObject(2)
Y++;
WaitForSingleObject(1)
X++;
ReleaseMutex(1)
ReleaseMutex(2)
のような時にデッドロックが起こると・・・。もし違ったらごめんなさい。
だとしたら、私のプログラムでデッドロックが起こる事はないような気もしますが・・・。
Mutexは一つしか作成してないですし。ちょっとスレッドプールによるデッドロックというのも
見かけたので、そっちについても調べてみます。
0434デフォルトの名無しさん
2007/05/27(日) 17:40:10ポインタの先にアクセスしないのに何が危険なのか
ポインタ変数そのものはただの変数
0435デフォルトの名無しさん
2007/05/27(日) 18:15:320436デフォルトの名無しさん
2007/05/27(日) 18:20:32その有効性が保証されてないからな。
NULL に何を足しても NULL になる処理系があっても
文句はいえないんじゃないだろうかね?
まあ、そんな無駄な処理を入れることはないだろうけど。
0437デフォルトの名無しさん
2007/05/27(日) 18:26:25たまに使うことがあるのに… orz
#include<stdio.h>
#define OFFSETOF(type, member) (int)(&((type*)0)->member)
typedef struct{
double x, y, z;
}vect3d;
int main(void){
printf("%d\n", OFFSETOF(vect3d, x));
printf("%d\n", OFFSETOF(vect3d, y));
printf("%d\n", OFFSETOF(vect3d, z));
return 0;
}
0438デフォルトの名無しさん
2007/05/27(日) 18:33:27何で自分で定義してるの?
0439デフォルトの名無しさん
2007/05/27(日) 18:37:28それはそれで規約で許されてるかどうかは微妙だな。
GCC も、__builtin_offsetof って言うビルトイン関数(関数と言っていいのか微妙だが)を使って実装してる。
0440電波高専生
2007/05/27(日) 18:51:32でも馬鹿なもんで全然わかりません。
そこで皆さんに教えてもらいたくてきますた。
マイクロI/Oカードをポケットコンピュータにつないで作るプログラム
なんですけど
「インターフェースボード上のディップスイッチの入力値(2進数)とは
逆の反転した値を表示するプログラムを作成せよ。」
って問題なんですけどわかりますか?
0441デフォルトの名無しさん
2007/05/27(日) 18:55:14分かりませんでしたー、で。
0442電波高専生
2007/05/27(日) 19:06:29ちなみに普通のディップSWの入力を出力するプログラムは
main()
{
int a;
FILE *fp;
fp=fopen("pio","r+");
pioset(0xf0);
clrscr;
while(1){
a=pioget();
a=a/16;
gotoxy(5,1);
printf("SW date=%4d",a);
pioput(a);
}
fclose(fp);
}
0443デフォルトの名無しさん
2007/05/27(日) 19:17:03↓
printf("SW date=%4d",~a);
但し a のビット数と pioget(); で取得できる有効なビット数の違いに注意
0444デフォルトの名無しさん
2007/05/27(日) 19:29:480445デフォルトの名無しさん
2007/05/27(日) 19:37:25それだと負数が出て問題ありでしょ?
0446デフォルトの名無しさん
2007/05/27(日) 19:41:490447デフォルトの名無しさん
2007/05/27(日) 19:47:42ろくに規約も読んでないくせに
適当な事を言わないでくれますか
初心者を騙してるというより
自分が知らないように見える
0448デフォルトの名無しさん
2007/05/27(日) 19:58:08何で文句だけ言って後は放置なのか理解できない。
0449デフォルトの名無しさん
2007/05/27(日) 19:59:170450デフォルトの名無しさん
2007/05/27(日) 21:14:54文字が入力されるたびに、入力文字のバイト数を測るにしても、
半角カタカナなどを入力された場合、1バイトになるためにその方法は使えません。
何かいい方法はないでしょうか?
0451デフォルトの名無しさん
2007/05/27(日) 21:18:01それって半角英数字以外は(記号なんかも含めて)全部日本語扱いになるの?
0452デフォルトの名無しさん
2007/05/27(日) 21:22:07{
double xx = (double) k + 0.5;
int n = 1054 - (*((unsigned *) &xx + LE) >> 20);
return n;
}
先頭の 0 の個数を数えるルーチンらしいけど、
このポインタ演算の部分が規約違反なのが原因で、
ちゃんと動作しないことがあるらしいね。
共用体使って書いても規約違反らしいが。
0453デフォルトの名無しさん
2007/05/27(日) 21:22:24IMEを使って変換して入力するようなものは全て日本語とします。
要は変換の作業がある文字と、そうでない文字に分けたいです。
半角英数字記号 -> abcd...xyz, AB...XYZ, 0123...89, @+:=^|\...etc
日本語 -> あいう〜わをん、0123…89、アイウ…ワオン、@+とか色々
0454デフォルトの名無しさん
2007/05/27(日) 21:24:28規約規約って気持ち悪いな。
規格言え馬鹿
0455デフォルトの名無しさん
2007/05/27(日) 21:27:410456デフォルトの名無しさん
2007/05/27(日) 21:28:55それじゃ定義が曖昧だな。
文字コードがいくらからいくらまでが、と具体的によろ。
0457デフォルトの名無しさん
2007/05/27(日) 21:30:21よくわからないからテキトーに答えるけど、
>文字が入力されるたびに、入力文字のバイト数を測るにしても、
>半角カタカナなどを入力された場合、1バイトになるためにその方法は使えません。
バイト数測った後、半角カタカナかどうか判定するんじゃ駄目なの?
0458デフォルトの名無しさん
2007/05/27(日) 21:35:240459デフォルトの名無しさん
2007/05/27(日) 22:07:42/tmp/cc8ncWpL.s: Assembler messages:
/tmp/cc8ncWpL.s:363: Error: missing or invalid immediate expression `' taken as 0
/tmp/cc8ncWpL.s:363: Error: suffix or operands invalid for `call'
/tmp/cc8ncWpL.s:369: Error: missing or invalid immediate expression `' taken as 0
/tmp/cc8ncWpL.s:369: Error: suffix or operands invalid for `call'
/tmp/cc8ncWpL.s:374: Error: missing or invalid immediate expression `' taken as 0
/tmp/cc8ncWpL.s:374: Error: suffix or operands invalid for `call'
/tmp/cc8ncWpL.s:380: Error: missing or invalid immediate expression `' taken as 0
/tmp/cc8ncWpL.s:380: Error: suffix or operands invalid for `call'
/tmp/cc8ncWpL.s:386: Error: missing or invalid immediate expression `' taken as 0
/tmp/cc8ncWpL.s:386: Error: suffix or operands invalid for `call'
/tmp/cc8ncWpL.s:392: Error: missing or invalid immediate expression `' taken as 0
/tmp/cc8ncWpL.s:392: Error: suffix or operands invalid for `call'
/tmp/cc8ncWpL.s:397: Error: missing or invalid immediate expression `' taken as 0
/tmp/cc8ncWpL.s:397: Error: suffix or operands invalid for `call'
/tmp/cc8ncWpL.s:403: Error: missing or invalid immediate expression `' taken as 0
/tmp/cc8ncWpL.s:403: Error: suffix or operands invalid for `call'
/tmp/cc8ncWpL.s:409: Error: missing or invalid immediate expression `' taken as 0
/tmp/cc8ncWpL.s:409: Error: suffix or operands invalid for `call'
http://www.uploda.org/uporg826781.c.html
ソースコード
プログラムのエラーなの?なんでアセンブラから?
0460デフォルトの名無しさん
2007/05/27(日) 22:13:430461デフォルトの名無しさん
2007/05/27(日) 22:14:260462デフォルトの名無しさん
2007/05/27(日) 22:15:47すまそ
0463デフォルトの名無しさん
2007/05/27(日) 23:56:23frexpを使ってできそうな気がする
0464デフォルトの名無しさん
2007/05/28(月) 06:27:180465デフォルトの名無しさん
2007/05/28(月) 07:54:01>>453に挙がってる文字は全て直接入力できるだろ。
0466デフォルトの名無しさん
2007/05/28(月) 08:34:50どうやって?
0467デフォルトの名無しさん
2007/05/28(月) 17:01:32どうやればいいのか、よくわからないから教えて欲しい。
lsコマンドを勉強したけど、イマイチなわかり具合だ。
0468デフォルトの名無しさん
2007/05/28(月) 17:03:370469デフォルトの名無しさん
2007/05/28(月) 17:05:560470デフォルトの名無しさん
2007/05/28(月) 17:06:330471デフォルトの名無しさん
2007/05/28(月) 17:15:45ワイルドカードは正規表現とは大分違う。
>>469
正規表現へのトランスレータを書くか、自前で全部書くか。
既存のものを参考にするのが一番早いと思うが。
0472デフォルトの名無しさん
2007/05/28(月) 17:19:54これじゃいかんの?
#include <stdio.h>
int main(void){
FILE *fp;
int moji;
fp=popen("/bin/ls *.c", "r");
while((moji=fgetc(fp))!=EOF) putchar(moji);
fclose(fp);
return 0;
}
0473デフォルトの名無しさん
2007/05/28(月) 18:28:19a.b.c と a.*.c のマッチングを例にすると、
まず a. は普通にマッチして、次に * にぶつかる。
ここで、残りの b.c と .c のマッチングを再帰で行う。
まあ失敗するから、次は最初の1つを除いた .c と .c のマッチングをまた再帰で行う。
ここでマッチングに成功するので、マッチする、と。
再帰してるのは、ワイルドカードが複数あった場合にも対処できるから。
0474デフォルトの名無しさん
2007/05/28(月) 19:39:11感動すた
0475デフォルトの名無しさん
2007/05/28(月) 19:41:16*の部分はシェルが展開しているようなのですが、シェルのソースコードを読めということでしょうか?
となるとOSによってかなり違いますよね..
0476デフォルトの名無しさん
2007/05/28(月) 19:43:590477467
2007/05/28(月) 20:11:04readdirのd_nameに溜め込まれたものから
strstrで".c"を探して、作りたい物が一応出来た。
まぁ、これでいいやw
0479デフォルトの名無しさん
2007/05/28(月) 20:33:320480デフォルトの名無しさん
2007/05/28(月) 20:36:06*.c
0481デフォルトの名無しさん
2007/05/28(月) 20:50:37$ls *.c
ls: *.c: No such file or directory
$ls *.c
コマンドまたはファイル名が正しくありません
のどちらかになるのがオチだろうに。
0482デフォルトの名無しさん
2007/05/28(月) 20:57:000483デフォルトの名無しさん
2007/05/28(月) 21:34:06そのままの文字列で渡されるお。
0484デフォルトの名無しさん
2007/05/28(月) 21:58:30WindowsならFindFirstFileにそのまま渡す
それだけで充分
0485デフォルトの名無しさん
2007/05/28(月) 22:03:31ls ~/*c
0486デフォルトの名無しさん
2007/05/29(火) 01:22:54UNIXでのCnoコンパイル/リンク時のオプションについて
ここで聞いてもよいでしょうか?
0487デフォルトの名無しさん
2007/05/29(火) 01:27:430488デフォルトの名無しさん
2007/05/29(火) 01:28:34使ってるコンパイラのスレで聞いた方が早いと思うぞ。
0489デフォルトの名無しさん
2007/05/29(火) 01:35:250490デフォルトの名無しさん
2007/05/29(火) 01:39:330491デフォルトの名無しさん
2007/05/29(火) 11:13:13ビットが足りないため0になってしまいますInt型とlong型で足りないのですが
71ビットまでの乗算が出来る型はあるのでしょうか?お願いします
0492デフォルトの名無しさん
2007/05/29(火) 11:15:330493デフォルトの名無しさん
2007/05/29(火) 11:25:250494デフォルトの名無しさん
2007/05/29(火) 11:41:5731ビットが限界でした・・・。ここまでこれたので手動で頑張ってみます
引き続き多倍長計算を参考に色々と弄ってみます。有難うございました!
0495デフォルトの名無しさん
2007/05/29(火) 12:26:15普通のCコンパイラならlong doubleで80ビット実数型が使える。
指数ビットがあるから精度は64ビットだけどそれでも足りない?
0496デフォルトの名無しさん
2007/05/29(火) 13:12:2960bit以上まで表示出来ました!ここまで計算出来るなら嬉しいです
計算量減って助かりました有難うございます!
0497デフォルトの名無しさん
2007/05/29(火) 13:18:520498デフォルトの名無しさん
2007/05/29(火) 17:41:3264 ビットの整数型を使えば。
ただ、BCC にあるのかどうかは知らんが。
0499デフォルトの名無しさん
2007/05/29(火) 17:47:040500デフォルトの名無しさん
2007/05/29(火) 18:11:490501デフォルトの名無しさん
2007/05/29(火) 18:56:21C言語を独学で学びたいのですが、最初に学び始める本で、オススメはありますか?
0502デフォルトの名無しさん
2007/05/29(火) 19:00:120503デフォルトの名無しさん
2007/05/29(火) 19:03:03C#がお勧め
0504デフォルトの名無しさん
2007/05/29(火) 20:01:20独学なんだから他人に頼るな
0505デフォルトの名無しさん
2007/05/29(火) 20:07:330506デフォルトの名無しさん
2007/05/29(火) 20:10:21>>501
推薦図書スレ池
0507デフォルトの名無しさん
2007/05/29(火) 20:16:08C#はJAVAに近い(J#あるけど)
C++はC言語の拡張(厳密言うと違うが…)
0508デフォルトの名無しさん
2007/05/29(火) 20:25:27少なくともC言語とは違います。
>>1 yondene
0509デフォルトの名無しさん
2007/05/29(火) 20:46:130510垣内
2007/05/30(水) 15:57:380511デフォルトの名無しさん
2007/05/30(水) 17:11:19あなたはどちらの言語様でしょうか?
0512デフォルトの名無しさん
2007/05/30(水) 17:37:00/ _ノ \
| ( ●)(●) <おっと、それ以上は言うなよ…
. | (__人__)____
| ` ⌒/ ─' 'ー\
. | /( ○) (○)\
. ヽ / ⌒(n_人__)⌒ \
ヽ |、 ( ヨ | ← >>510
/ `ー─− 厂 /
| 、 _ __,,/ \
0513デフォルトの名無しさん
2007/05/30(水) 17:44:15【審議中】
∧,,∧ ∧,,∧
∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) U) ( つと ノ(ω・` )
| U ( ´・) (・` ) と ノ
u-u (l ) ( ノu-u
`u-u'. `u-u'
0514デフォルトの名無しさん
2007/05/30(水) 21:24:00このプログラムをベースに入力する秒数を実数にして時間・分・秒数に変換するプログラムを作成する
教えてください
♯include <stdio.h>
intmain(void)
{
int ji,fun,byou;
printf("秒数=")
scanf("%d",&byou);
ji=byou/3600;
byou=byou%3600;
fun=byou/60;
byou=byou%60;
printf("%d時間%d分%d秒\n",ji,fun,byou);
return0;
}
0515デフォルトの名無しさん
2007/05/30(水) 21:28:06なんでそんな明らかにコンパイル出来ないソースを書くかなぁ・・・
0516デフォルトの名無しさん
2007/05/30(水) 21:30:10♯include <stdio.h>
intmain(void)
{
int ji,fun,byou;
printf("秒数=")
scanf("%d",&byou);
fun=byou/60;
byou=byou%60;
ji=fun/60;
fun=fun%60;
printf("%d時間%d分%d秒\n",ji,fun,byou);
return0;
}
0517デフォルトの名無しさん
2007/05/30(水) 21:33:07つか、宿題スレにも!
0518デフォルトの名無しさん
2007/05/30(水) 22:00:070519デフォルトの名無しさん
2007/05/30(水) 22:06:59スレ違い
0520デフォルトの名無しさん
2007/05/30(水) 22:10:02aの値が10を超えたら0にしようと思ったのですが
if (a < 10) a = 0;
コレじゃだめなんですか?
コンパイラはVC2003でつ
初心者すぎますかね?
0521デフォルトの名無しさん
2007/05/30(水) 22:14:320522デフォルトの名無しさん
2007/05/30(水) 22:15:12if (a < 10) だとaが10未満の場合だぞ
0523デフォルトの名無しさん
2007/05/30(水) 22:20:140524デフォルトの名無しさん
2007/05/30(水) 22:22:20if(10<=a)a=0;
0525デフォルトの名無しさん
2007/05/30(水) 22:36:570526デフォルトの名無しさん
2007/05/30(水) 22:40:11∧,,∧ ∧,,∧
∧ (´-ω-) (-ω-`) ∧∧
( ´-ω) U) ( つと ノ(ω-` ) zzz...
| U ( ´-) (-` ) と ノ
u-u (l ) ( ノu-u
`u-u'. `u-u'
0527デフォルトの名無しさん
2007/05/30(水) 22:41:530528デフォルトの名無しさん
2007/05/30(水) 22:44:09∧,,∧ ∧,,∧
∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) U) ( つと ノ(ω・` )
| U ( ´・) (・` ) と ノ
u-u (l ) ( ノu-u
`u-u'. `u-u'
0529デフォルトの名無しさん
2007/05/30(水) 22:44:48ババ バババ ババババ
バババ ∧_,∧ ババ ∧_∧ バババ
∧_∧バ( ´・ω・∧_∧ (・ω・` ) ∧_∧
(´・ω・)=つ≡つ);;)ω(;;(⊂≡⊂=(・ω・`)
(っ ≡つ=つ (っ>527⊂) ⊂=⊂≡ ⊂)
/ ) バ∧_∧| x |∧_∧ バ ( \
( / ̄∪バ ( ´・) ∪ ̄∪(・` )ババ ∪ ̄\ )
ババババ/ ) バババ ( \ ババババ
バババ `u-u'. バババ ババ `u-u'
0530デフォルトの名無しさん
2007/05/30(水) 22:46:270531デフォルトの名無しさん
2007/05/30(水) 22:47:140532デフォルトの名無しさん
2007/05/30(水) 22:48:350533デフォルトの名無しさん
2007/05/30(水) 22:58:150534520
2007/05/30(水) 23:09:13気が付かなかった
0535デフォルトの名無しさん
2007/05/31(木) 00:20:36をパソコンにインストールしたいのですが、
その時に
Visual J# .Net Redistributable Package
が必要なんですがこれをインストールしようとすると、
.NET Framework v1.0.3705
が必要と出てきてしまいます。
私のPCには.NET Framework v1.1.4322が入っており
上記のものをインストールする事が出来ません。
どうしたら良いのでしょうか?
0536デフォルトの名無しさん
2007/05/31(木) 00:39:43int main(void)
{
printf("逝ってよし");
reurn 0;
}
0537デフォルトの名無しさん
2007/05/31(木) 00:47:050538デフォルトの名無しさん
2007/05/31(木) 00:49:490539デフォルトの名無しさん
2007/05/31(木) 00:50:510540デフォルトの名無しさん
2007/05/31(木) 00:51:480541デフォルトの名無しさん
2007/05/31(木) 01:02:470542デフォルトの名無しさん
2007/05/31(木) 01:04:050543デフォルトの名無しさん
2007/05/31(木) 03:06:03char str[] = "あ";
unsigned int c = str[0];
?????
0544デフォルトの名無しさん
2007/05/31(木) 03:18:41printf() とか sprintf() とか
0545デフォルトの名無しさん
2007/05/31(木) 03:30:460546デフォルトの名無しさん
2007/05/31(木) 04:08:29”あ”が1バイト文字なのか2バイト文字なのか判定したいのです。
0547デフォルトの名無しさん
2007/05/31(木) 04:21:13sizeof(str)が3なら2バイト文字だが、やりたいのはきっとそういうこ
とじゃないよね。
strにどんな文字コードで文字が入っているか(Shift_JISとかUTF-8とか)
はわかるのかい?
0548デフォルトの名無しさん
2007/05/31(木) 04:37:020549デフォルトの名無しさん
2007/05/31(木) 05:05:56であれば、
unsigned char c = str[0];
if (0x81 <= c && c <= 0x9f || 0xe0 <= c && c <= 0xfc) {
...
でいい。
ismbblead() とか IsDBCSLeadByte() が使えるなら、そっちを使ったほ
うがいいです。
0550デフォルトの名無しさん
2007/05/31(木) 05:28:15ありがとう。なんか難しく考えすぎてました。
APIもあるんだ。
0551デフォルトの名無しさん
2007/05/31(木) 11:55:100552デフォルトの名無しさん
2007/05/31(木) 22:00:15よろしくお願いします。
#define pletohs(p) ((short) \
((short)*((const char *)(p)+1)<<8| \
(short)*((const char *)(p)+0)<<0))
0553デフォルトの名無しさん
2007/05/31(木) 22:08:30short pletohs(const char *p) {
return (short)p[1] << 8 | (short)p[0];
}
みたいなもんか。
その環境のバイトオーダに関係なく
リトルエンディアンのshort値を取得したいんじゃないかね。
p は const unsigned char じゃないとヤバいと思うが。
0554デフォルトの名無しさん
2007/05/31(木) 22:16:35ポインタ リトルエンディアン->ホストエンディアン short型
0555552
2007/05/31(木) 22:20:59なるほど、ありがとうございます。助かりました。
0556デフォルトの名無しさん
2007/05/31(木) 22:22:57文字列の宣言には
char *msg = "i love you";
char msg[] = "i hate you";
と2種類の方法があることを習ってしばらく経ちました。
仕組み自体は大体わかってます。
自分的には、大雑把な特徴としては
char *msgは、原則書き換え不可
char msg[]は書き換えがラクチン、というイメージがあるのですが
そうするとchar *msgの方は存在意義が無くないでしょうか?
char *msgと書かれた部分は別にchar msg[]では替えが聞くのでは?
ただそれなのにいろんな本を読めばchar *msgという宣言は腐るほどあります。
ポインタで宣言するメリットって何なんでしょうか?
0557デフォルトの名無しさん
2007/05/31(木) 22:24:31while(*msg)putchar(*msg++);ができるあたり
0558デフォルトの名無しさん
2007/05/31(木) 22:27:41ポインタで充分なときに余計な配列を確保しない。
#詳細はお風呂上りにでも♪
0559デフォルトの名無しさん
2007/05/31(木) 22:33:53の方が最適化的に良い、ってのは誰の話だっけか
0560デフォルトの名無しさん
2007/05/31(木) 22:58:00どうもです。やっぱり「エレガントな記法ができる」「無駄が省ける」程度の話であって
本質的に違いがあるわけではないのですかね。。。
>>558
おながいしまつ。期待してます。
0561デフォルトの名無しさん
2007/05/31(木) 23:00:30char *msg = "i love you";
はどこかにある文字列リテラル(静的)へのアドレスが msg に代入される。
char msg[] = "i hate you";
は msg という配列変数を作って、その文字列で初期化する。
msg が静的でないなら、毎回コピーが発生する。
0562デフォルトの名無しさん
2007/06/01(金) 00:09:12((中略))
if(64>a);
{
putchar(a-32);
}
else if(32>a)
{
putchar(a+32);
という式を作ってみましたが、根本的に何かが違うみたいです
0563デフォルトの名無しさん
2007/06/01(金) 00:13:52'a' <= a && a <= 'z'
0564デフォルトの名無しさん
2007/06/01(金) 00:19:07まんまと罠に嵌るのが目に見える
0565デフォルトの名無しさん
2007/06/01(金) 01:18:53はどのような感じでプログラムを組めばいいんでしょうか
0566デフォルトの名無しさん
2007/06/01(金) 01:19:54表示(入力した文字);
}
0567デフォルトの名無しさん
2007/06/01(金) 01:23:49if(条件) {
/* 表示しない */
} else {
表示(文字);
}
の方が読みやすい事もある。
好みの問題だが。
条件をド・モルガンの法則で逆転させるのは
条件が読みづらくなることがあるので、あまり勧めない。
>>566 みたいに分かりやすい条件をベースにして、
! で条件をひっくり返すのがいい。
0568デフォルトの名無しさん
2007/06/01(金) 01:26:380569デフォルトの名無しさん
2007/06/01(金) 01:28:38表示(文字);
}
0570デフォルトの名無しさん
2007/06/01(金) 01:31:00制御文を勝手に増やすと
読みづらいと文句が(ry
0571デフォルトの名無しさん
2007/06/01(金) 07:49:55Debug Assertion Failed!
Program:..
File:isctype.c
Line:56
Expression:(unsigned)(c + 1) <= 256
というエラーがでます。このisctype.cは自分で作成したものではなく、実際にソースを呼んでも良くわかりません。
また、デバッグモードで実行すると
プログラム '[492] test.exe: ネイティブ' はコード 3 (0x3) で終了しました。
と表示されます。
このエラーを改善するためにはどのようにすればいいでしょうか?
0572デフォルトの名無しさん
2007/06/01(金) 08:52:26まずソースを貼れ
0573デフォルトの名無しさん
2007/06/01(金) 12:27:42エラーには大きく分けて2通りある。
1つは、「ビルド時に発生するエラー」。この場合は、文法の誤り等がある。さらにコンパイルエラーとリンクエラーとに分かれる。
もう1つは、「実行時に発生するエラー」。この場合、実行時にOS上でありえない動作をしたらエラーが発生する(例外が発生するという)。
例えばプログラム実行時に0で除算したり、確保していない領域にたいして値を書き込もうとすると発生する。
この場合、実行時にエラーが発生している。
デバッグモードで1ステップずつ実行して、定義した変数の動きを追いかけたら?
0574デフォルトの名無しさん
2007/06/01(金) 12:31:530575デフォルトの名無しさん
2007/06/01(金) 12:43:160576デフォルトの名無しさん
2007/06/01(金) 12:49:27この関数に256以上の数値を渡したってことだべ。
実際にアサーション起こしたところで中断選んで、
デバッグのウィンドウの呼び出し履歴から、
自分で書いたソースの部分をダブルクリックか、右クリック+ソースコードへ移動、で
クイックウォッチあたりで変数に何が入ってるか見てみよう。
0577576
2007/06/01(金) 12:53:000578デフォルトの名無しさん
2007/06/01(金) 14:12:10誰か教えてくださいm(_ _)m
0579デフォルトの名無しさん
2007/06/01(金) 14:19:28宿題は宿題スレへ。
0580デフォルトの名無しさん
2007/06/02(土) 16:25:14という風に%で計算したいのですが、いざ表示すると
a % %d =%d
になってしまうのですが、改善方法はないでしょうか
0581デフォルトの名無しさん
2007/06/02(土) 16:32:360582デフォルトの名無しさん
2007/06/02(土) 16:32:37printf("%d % %d=%d\n", a, b, a%b);
こういうことかい?
0583デフォルトの名無しさん
2007/06/02(土) 16:33:400584デフォルトの名無しさん
2007/06/02(土) 16:34:31正解
0585デフォルトの名無しさん
2007/06/02(土) 16:36:34偉そう
0586デフォルトの名無しさん
2007/06/02(土) 16:39:59ば、ばか、本当に偉い人だったらどうするんだ
0587デフォルトの名無しさん
2007/06/02(土) 16:51:53バカ
>>584
正解
0588デフォルトの名無しさん
2007/06/02(土) 16:55:100589デフォルトの名無しさん
2007/06/02(土) 17:06:320590デフォルトの名無しさん
2007/06/03(日) 18:55:18を意訳してみようと努力すると、
printf("%d %% %d=%d\n"a,b,a*b/100);
とか。
0591デフォルトの名無しさん
2007/06/03(日) 21:23:37どう意訳するとそうなるんだ?
しかも等価式でなくなるし
0592デフォルトの名無しさん
2007/06/03(日) 21:28:150593デフォルトの名無しさん
2007/06/03(日) 23:28:35きっと、%使う→百分率→*100すりゃいいんでね?とかじゃねぇの?
よくわかんねぇけどw
0594デフォルトの名無しさん
2007/06/03(日) 23:37:23*100でもねぇし、わがんねw
逝ってきます
0595デフォルトの名無しさん
2007/06/03(日) 23:38:220596590
2007/06/04(月) 00:48:13> という風に%で計算したい
って有るから、なんとなく
> printf("%d % %d=%d\n",a%b);
は「a の b% は ???」みたいな解釈です。
0597デフォルトの名無しさん
2007/06/04(月) 00:49:32偽者乙
0598デフォルトの名無しさん
2007/06/04(月) 07:52:510599デフォルトの名無しさん
2007/06/04(月) 21:00:48先輩方が使っているお勧めの参考書とかありますか?
0600デフォルトの名無しさん
2007/06/04(月) 21:02:350601デフォルトの名無しさん
2007/06/04(月) 21:07:370602デフォルトの名無しさん
2007/06/04(月) 21:08:260603クマーッ!!
2007/06/04(月) 21:09:540604デフォルトの名無しさん
2007/06/04(月) 21:10:290605デフォルトの名無しさん
2007/06/04(月) 21:14:030606デフォルトの名無しさん
2007/06/04(月) 21:17:480607デフォルトの名無しさん
2007/06/04(月) 21:20:420608デフォルトの名無しさん
2007/06/04(月) 21:24:480609デフォルトの名無しさん
2007/06/04(月) 21:27:030610デフォルトの名無しさん
2007/06/04(月) 21:27:460611デフォルトの名無しさん
2007/06/04(月) 21:29:000612デフォルトの名無しさん
2007/06/04(月) 21:29:36え?ぜんぜん違う?気にするなYO!
0613デフォルトの名無しさん
2007/06/04(月) 21:59:48は俺の書き込みじゃないよ〜
0614デフォルトの名無しさん
2007/06/04(月) 22:01:26フローチャートについて詳しく書かれている参考書を教えてください
0615デフォルトの名無しさん
2007/06/04(月) 22:08:43まぁ、いいや
0616デフォルトの名無しさん
2007/06/04(月) 22:08:450617デフォルトの名無しさん
2007/06/04(月) 22:24:220618デフォルトの名無しさん
2007/06/04(月) 22:31:12つttp://www.bohyoh.com/Books/CAlgoData/index.html
0619デフォルトの名無しさん
2007/06/04(月) 22:31:31NHKへようこそ
0620デフォルトの名無しさん
2007/06/07(木) 08:41:500621デフォルトの名無しさん
2007/06/07(木) 13:34:32int tango[i];
int i = 0;
ってできますか?
配列を使って単語の長さを調べてヒストグラムにするプログラムを作らなきゃならないんですけど
単語の長さがあらかじめ決まってないので、入力された単語の長さで配列の長さを調整できるようにしたいんです
0622デフォルトの名無しさん
2007/06/07(木) 13:41:14そうでないなら malloc。
0623デフォルトの名無しさん
2007/06/07(木) 14:44:12http://www.sra.co.jp/wingnut/gcc/gcc-j.html#Variable%20Length
0624デフォルトの名無しさん
2007/06/07(木) 16:49:19C言語之参考書を買ったのですがハードウェアの事が書いてあり疑問があります
記号や文字列と連動しているので、ハード板でなく此処で質問させて戴きます
どうして、1KBが1024B、1MBが1024KB等と
中途半端に1024なのでしょうか?どうして、10の〜上が、24と付くのでしょうか?
0625デフォルトの名無しさん
2007/06/07(木) 16:51:370626デフォルトの名無しさん
2007/06/07(木) 16:52:580627デフォルトの名無しさん
2007/06/07(木) 16:52:592^(10n)
0628デフォルトの名無しさん
2007/06/07(木) 16:57:14何がいけないんでしょうか? なんど読み返してもさっぱりわからんとです・・・
#include <stdio.h>
int main(void)
{
int binary[10];
int a,b,t,i;
printf("a:"); scanf("%d",&a);
printf("b:"); scanf("%d",&b);
t = a + b;
for(i=0;i<10;i++)
binary[i]=0;
while(t >= 0){
binary[i] = t % 2;
i--;
t = t / 2;
}
for(i=0;i<10;i++)
printf("%d",binary[i]);
printf("\n");
return 0;
}
0629デフォルトの名無しさん
2007/06/07(木) 17:01:010630デフォルトの名無しさん
2007/06/07(木) 17:07:48無限ループ
0631デフォルトの名無しさん
2007/06/07(木) 17:08:01だから、最初にいきなりbinary[10] にアクセスしてる
あと>>629の部分で無限ループ
0632624
2007/06/07(木) 17:11:36どうして2^(10n)、2の階上が(10n)なのでしょうか?
実際は10×10…でなく、2×2…なんでしょうか?
だとしたら、どうして10の〜上と書いてあるのですかね?
0633デフォルトの名無しさん
2007/06/07(木) 17:13:420634デフォルトの名無しさん
2007/06/07(木) 17:15:002^0=1
2^1=2
2^2=4
2^3=8
2^4=16
2^5=32
2^6=64
2^7=128
2^8=256
2^9=512
2^10=1024
2^12=4096
2^16=65536
2^24=16777216
2^31=2147483648
2^32=4294967296
2^64=18446744073709551616
はコンピュータ・プログラミングの世界でよく出てくるから暗記しとけ。
0635デフォルトの名無しさん
2007/06/07(木) 17:16:42そのままキロで使ってるだけだけどね。
0636628
2007/06/07(木) 17:18:01最初のForループを
for(i=0;i<=9;i++)
binary[i]=0;
に変更しました。これでi=9になりますね
あとよくわからないのが while(t>=0) がなんで無限ループに入っちゃうんでしょうか?
while(t >= 0){
binary[i] = t % 2;
i--;
t = t / 2;
}
で、例えばt=6の場合は t = t / 2; により 6 → 3 → 1 → 0 で4ループで終わりというふうに考えてたんですけど
何故か無限ループ・・・ while(t!=0) にしたら直りましたけど
0637デフォルトの名無しさん
2007/06/07(木) 17:18:33(0>=0)は真か偽か
0638デフォルトの名無しさん
2007/06/07(木) 17:19:50あ、そうか(汗
すみませんでした
恥ずかしい
0以下にはならないんですよね
ややっこしい
0639デフォルトの名無しさん
2007/06/07(木) 17:20:13forループが終了するのはi<=9を満たさないとき、つまりi=10になったときだからなんにも変わってないぞ。
0640デフォルトの名無しさん
2007/06/07(木) 17:22:46本当だ・・・
for(i=0;i<=9;i++)
binary[i-1]=0;
に変更
難しいなあ
0641デフォルトの名無しさん
2007/06/07(木) 17:28:10while 抜けた後の i は、次に判断するであろう場所を指す
だから全体を 0 で初期化しなくてもなんとかなりそうだとは思う
0642デフォルトの名無しさん
2007/06/07(木) 17:28:12i=9にしないと駄目か
全然だめだ
0643デフォルトの名無しさん
2007/06/07(木) 17:29:23自分でも「K」と大文字で書いているじゃないか。
それは「killo (×1000)」ではない。
0644デフォルトの名無しさん
2007/06/07(木) 17:30:590645デフォルトの名無しさん
2007/06/07(木) 17:31:19#include <stdio.h>
int main(void)
{
int binary[32] = {0};
int a,b,t,i;
printf("a:"); scanf("%d",&a);
printf("b:"); scanf("%d",&b);
t = a + b;
i=0;
while(t){
binary[i++] = t % 2;
t = t / 2;
}
while(i--) printf("%d", binary[i]);
printf("\n");
return 0;
}
0646デフォルトの名無しさん
2007/06/07(木) 17:47:45なんてエレガントな・・・
0647デフォルトの名無しさん
2007/06/07(木) 17:50:5406481/2
2007/06/07(木) 18:47:27#define BITDEPTH 32
#define MSB BITDEPTH-1
#define LSB 0
#define SIGN_BIT MSB
// 10進数の整数を0と1が入る配列に変換
void dec2bin(int dec, int bin[BITDEPTH]) {
unsigned int i;
// 符号ビットの判定
if (dec < 0) {
bin[SIGN_BIT] = 1;
dec *= -1;
}
else bin[SIGN_BIT] = 0;
// 符号ビットの前から最下位ビットまで探査
for (i = MSB-1; i > LSB; --i) {
if (dec & (2 << (i-1) )) bin[i] = 1;
else bin[i] = 0;
}
// 最下位ビットを判定
if (dec & 1) bin[LSB] = 1;
else bin[LSB] = 0;
}
06492/2
2007/06/07(木) 18:48:13void out_bin(int bin[BITDEPTH]) {
char str[BITDEPTH + 1];
unsigned int i;
// 文字列を作る
for (i = 0; i < BITDEPTH; ++i) {
if (bin[MSB -i] != 0) str[i] = '1';
else str[i] = '0';
}
str[BITDEPTH] = '\0';
printf("bin:%s", str);
}
int main() {
int bin[BITDEPTH];
dec2bin(-100, bin);
out_bin(bin);
return 0;
}
駄目出しお願いします
0650デフォルトの名無しさん
2007/06/07(木) 19:18:20printfを随所に置く(必要なら1行毎にでも)とかデバッガを使うとかで、
変数の値の変化や処理の流れが自分の思っている通りなのかを確認しましょう。
これを「デバッグ」と言います。
デバッグなしでプログラム作るなんて不可能だよ。
こういうことって、初心者向けの本やサイトに書いてないものなの??
0651デフォルトの名無しさん
2007/06/07(木) 19:30:470652デフォルトの名無しさん
2007/06/07(木) 19:34:32int 配列に一旦変換するのは必須なわけ?
直接出力しちゃダメなの?
0653デフォルトの名無しさん
2007/06/07(木) 19:42:47デバッガは一応VSのを使ってます
一発目だとエラーでたり変な値出たりして大変だったので
ウォッチ式や変数ビューア、エディットコンティニューとか使って何とか書き直しました
これら無しじゃ多分完成してません
最初は
>>652
出力方法を変えたい時や、IDEの機能を使ってのデバッグの簡単化の為に別関数にしただけです
そういう意図で分けるのってよくないんでしょうか?
0654デフォルトの名無しさん
2007/06/07(木) 20:20:05ん、まあ別にいいとは思うけど。
符号ビットをわざわざ処理してるのは、
負の値が2の補数形式でない場合でも、
2の補数形式として出力するようにするため?
あと、
if (dec & (2 << (i-1) )) bin[i] = 1;
は
if (dec & (1 << i)) bin[i] = 1;
にしない理由はあるの?
あと出力時に文字列を生成してから出力してるけど、
putchar で随時出力しないのはデバッガ云々のため?
0655デフォルトの名無しさん
2007/06/07(木) 20:39:32>符号ビットをわざわざ処理してるのは
符号と、絶対値に問題を分けたかったからです
あと2の補数形式による表現を忘れたのも原因です(汗
>if (dec & (2 << (i-1) )) bin[i] = 1;
>if (dec & (1 << i)) bin[i] = 1;
これは完璧に思いつきませんでした
どうにか-1を消す方法が無いかと考えたんですが、
結局思いつかなくてそのままにしてました
>putchar で随時出力しないのはデバッガ云々のため?
これも切り分けですかね
一緒に考えるのも変わらない気がするんですが
個人的に分けて考える方がやりやすいんで、その癖です
0656デフォルトの名無しさん
2007/06/07(木) 21:19:21逆に2の補数形式「じゃない」方の形式になるんだったわ。
間違えたっす。
0657デフォルトの名無しさん
2007/06/07(木) 21:22:15if ((dec & (1 << i)) != 0)
みたいに。
ま、文法上は問題ないんだけどね。
まあ、それ以前に
bin[i] = ((dec & (1 << i)) != 0);
とすれば if 文要らないんだけど。
0658デフォルトの名無しさん
2007/06/07(木) 23:25:310659デフォルトの名無しさん
2007/06/07(木) 23:34:370660デフォルトの名無しさん
2007/06/07(木) 23:51:03文法は
型 自作関数名(型 変数名 、型 変数名)
となってますが、自作に渡す仮引数が一つしかない場合は
型 自作関数名(型 変数名)
でもかまわないんでしょうか?
0661デフォルトの名無しさん
2007/06/07(木) 23:52:120662デフォルトの名無しさん
2007/06/07(木) 23:55:22型 自作関数名(型 変数名, 型 変数名, 型 変数名)
だぞ
0663デフォルトの名無しさん
2007/06/07(木) 23:56:340664デフォルトの名無しさん
2007/06/08(金) 00:16:32例題1
#include <stdio.h>
main(void)
{
float fahr,celsius;
int lower,upper,step;
lower = 0;
upper = 300;
step = 20;
fahr = lower;
printf("華氏 \t 摂氏\n");
while(fahr <= upper){
celsius = (5.0/9.0) * (fahr-32.0);
printf("%3.0f\t%6.1f\n",fahr,celsius);
fahr = fahr + step;
}
return 0;
}
例題1を自作関数を使って計算させろという問題なんですが 下に続く
0665デフォルトの名無しさん
2007/06/08(金) 00:19:37こういう考えじゃ上達しないよ。
ダメと言われてもいいからとりあえずやってみる。
それが上達への近道。
0666デフォルトの名無しさん
2007/06/08(金) 00:19:39適当な関数作って、試してみればよかろう。
void test1( int a, int b) {
puts("test1");
}
void test2( int a) {
puts("test2");
}
これを書くのと、ココに書き込むの。どっちが早い?
(慣れてないと、こっちのほうが早いのかな?)
0667デフォルトの名無しさん
2007/06/08(金) 00:20:06float conve(int m);
main(void)
{
int i;
printf(" 華氏\t 摂氏\n");
for(i=0;i<=300;i+=20){
printf(" %3d\t%6.1f\n",i,conve(i));
}
return 0;
}
float conve(int fahr)
{
float celsius;
celsius = (5.0/9.0)*(fahr-32.0);
return celsius;
}
こんな感じOKでしょうか?
何か変更した方がいい点とかあったら教えてください
とりあえず授業では初歩的な部分しか習ってません
For While Swhitch If 一次配列 くらいです
0668デフォルトの名無しさん
2007/06/08(金) 00:21:43>>666
そうですね
まだ自作関数の理解が不十分だったんで聞いちゃいました
でももうなんとなく理解できました
0669デフォルトの名無しさん
2007/06/08(金) 00:24:43つ【Swhitch】のすp(ry
プロトタイプ宣言と実体の引数の名前が違う。混乱の元になるのであわせたほうがベター
mainにint型を返すことを明確に示しましょう。
隅をつつこうと思えば、まだまだあるけど今はこんなもん?
0670デフォルトの名無しさん
2007/06/08(金) 00:36:15switch ですね・・・修正
>プロトタイプ宣言と実体の引数の名前が違う。混乱の元になるのであわせたほうがベター
参考書では別の名前を使っていたので別にしないといけないものだと思ってました
たしかに混乱しますね
名前は同じに修正しました
隅をつつくと何がでてくるのかちょっと気になりますね・・・
0671デフォルトの名無しさん
2007/06/08(金) 00:46:57何て本だか気になる。
0672デフォルトの名無しさん
2007/06/08(金) 01:03:07float conve(int fahr)は
float fahr_to_celsius(float fahr)
{
return (5.0/9.0)*(fahr-32.0);
}
かな。
関数名を処理内容に沿った名前へ。
結果がfloatなので仮引数もfloat型に。
0673デフォルトの名無しさん
2007/06/08(金) 01:09:56プログラミング言語C K&R です
>>672
どうもです、ちょっと修正して見やすくしてみました
#include <stdio.h>
#define lower 0 /* 華氏の下限 */
#define step 20 /* きざみ */
#define upper 300 /* 華氏の上限 */
float conve(float fahr);
int main(void)
{
float f; /* 華氏 */
f = lower;
printf(" 華氏\t 摂氏\n");
while(f<=upper){
printf(" %3.0f\t%6.1f\n",f,conve(f));
f+=step;
}
return 0;
}
float conve(float fahr)
{
float celsius;/* 摂氏 */
celsius = (5.0/9.0)*(fahr-32.0);
return celsius;
}
0674デフォルトの名無しさん
2007/06/08(金) 01:14:09向上心すごいね、プログラム楽しい?がんばってね。
defineは大文字にしたほうがいいかな?
0675デフォルトの名無しさん
2007/06/08(金) 01:19:04for (f = lower; f <= upper; f += step)
0676デフォルトの名無しさん
2007/06/08(金) 01:19:260677デフォルトの名無しさん
2007/06/08(金) 01:23:030678デフォルトの名無しさん
2007/06/08(金) 02:13:27> for (f = lower; f <= upper; f += step)
諸兄ら、floatの比較演算はどう思う?
俺は、この場合はintにすべきだと思うのだが。
(f==upperのときループが実行されるのを期待してるので)
で、こう?
conve((float)i)
0679デフォルトの名無しさん
2007/06/08(金) 02:18:22浮動小数に加算するとそもそも誤差がでるから避けるのが無難だが
まぁこの程度なら別にいいと思うがな
0680デフォルトの名無しさん
2007/06/08(金) 03:58:210681デフォルトの名無しさん
2007/06/08(金) 03:59:36ループ回数を確実に制御しなければならない場合はintで回すね。
比較演算子に不等号が入っているならそんなに心配せんでも医院で内科医。
0682デフォルトの名無しさん
2007/06/08(金) 04:02:59スレ違い
http://pc11.2ch.net/test/read.cgi/tech/1181087371/
0683デフォルトの名無しさん
2007/06/08(金) 10:30:54詳しく知らないけど、浮動小数点の加算の誤差は
必ず実際の数より小さくなるんだっけ?
指数の展開の仕方に寄るんだろうけど
個人的には300Kの値が表示されない時がありそうで怖い。
0684デフォルトの名無しさん
2007/06/08(金) 12:16:40必ずかどうかは知らないけれど、大きくなることは少ないとは思う。
まぁ、整数でループ制御するべきだね。
0685684
2007/06/08(金) 12:20:44この場合は条件自体がすべて整数だから、実数でも問題はない。
つまり、(精度が間に合う範囲であれば)整数同士の加算を実数で行なっても誤差は出ない。
具体的には、800万辺りまでは問題がない。
0686デフォルトの名無しさん
2007/06/08(金) 12:32:38甘いな。仮数部は23ビットだが最上位の1は省略されるから、実質24ビットの精度がある。
だから16777216と16777215はきちんと区別できる。16777215+1が16777216になるかはしらね。
0687デフォルトの名無しさん
2007/06/08(金) 14:27:0816777216+1は16777216のままだな。
まあ、当たり前の話だが。
0688デフォルトの名無しさん
2007/06/08(金) 15:23:42とりあえずプログラムを実行すると、“続行するには何かキーを押してください . . .”
という表示が出て、何かキーを押すと終了するようになっています。
しかし、出来た実行ファイル(.exe)を実行すると一瞬コンソール画面が表示されて
“続行す(ry”が表示されずに終わってしまいます。
実行ファイルでも同じような動作をさせたいのですが、どのようにすればいいのでしょうか?
プログラム終了直前でscanfで何かを入力待ちにするのもいいのですが、この場合何かキーボードを
押しただけでは終了しませんし、何も入力せずにEnterキーを押しただけでは終了しません。
何かいい方法はないでしょうか?
0689デフォルトの名無しさん
2007/06/08(金) 15:27:160690デフォルトの名無しさん
2007/06/08(金) 15:30:33if(IsDebuggerPresent()) getch();
しとけ
それかCtrl+F5
0691デフォルトの名無しさん
2007/06/08(金) 15:30:41つ[getchar()]
0692デフォルトの名無しさん
2007/06/08(金) 15:33:30というショートカットをSendToに入れておいて渡す
0693デフォルトの名無しさん
2007/06/08(金) 15:34:570694デフォルトの名無しさん
2007/06/08(金) 15:36:59ありがとうございます。しかし、Enterキー以外のものを押された時は
その後Enterキーを押さないと処理が終わらないようですね・・・。
0695デフォルトの名無しさん
2007/06/08(金) 15:42:23>“続行するには何かキーを押してください . . .”という表示が出て
実はこの時点でもうあなたが書いたプログラムは実行し終わった後なんですよ。
“続行す(ry”というのは、pauseというコマンドプロンプト(cmd.exe)の組み込みコマンドです。
適当なバッチファイルを作って、あなたが書いたプログラムを実行した後pauseをすれば
同じような動作になります。
というか、コマンドプロンプトを起動してその上であなたが書いたプログラムを実行すれば、
たぶんそれがあなたが望む状態なんじゃないかと思います。
0696デフォルトの名無しさん
2007/06/08(金) 15:59:00なるほどです。system("pause")ってやってみたら、目的の動作をしました。
ありがとうございます。
0697デフォルトの名無しさん
2007/06/08(金) 18:01:09コマンドプロンプトで実行するものだよ。
0698デフォルトの名無しさん
2007/06/08(金) 19:39:480 2 4 6 8 10
としたいのですが
#include <stdio.h>
int main( void )
{
int i;
int vc[6]={0,2,4,6,8,10};
for (i=5;i>=0;i--){ /*表示*/
printf("%d", data[i]);
}
putchar('\n');
return(0);
}
でやると8行目が
'data' : 定義されていない識別子です
配列または、ポインタでない変数に添字が使われました。
と表示されるのですが何がいけないんでしょうか?
0699デフォルトの名無しさん
2007/06/08(金) 19:42:38>for (i=5;i>=0;i--){ /*表示*/
>printf("%d", data[i]);
素で理解できてない?
単に呆け?
それとも釣り?
0700デフォルトの名無しさん
2007/06/08(金) 19:49:07data[i]
はどこにある?
あと表示が 0 2 4 6 8 10 なのになぜ逆順で?
0701デフォルトの名無しさん
2007/06/08(金) 19:53:17答:理解する気がまったくない。
なぜなら宿題の回答さえ得られれば良いから。
0702デフォルトの名無しさん
2007/06/08(金) 19:55:23data[i]をvc[i]に変えたらいいんだよ。
あと、for(i=5;i>=0;i--)をfor(i=0; i<6; i++)にした方が目的の結果が得られるかもしれない。
きちんとfor文が何をやっているのか、変数の定義と使い方を理解した方がいいと思うよ。
0703デフォルトの名無しさん
2007/06/08(金) 20:52:170704デフォルトの名無しさん
2007/06/08(金) 21:17:07ありがとうございます
あとあと、
要素型がdouble型であり4個の要素をもつ配列vzを用意して、順番にキーボードから値を読み込み、その後、その内容を表示するプログラムを作成しなさい(表示は8桁、小数点以下2表示)
実行結果例
vz[0]=1,3
vz[1]=2,5
vz[2]=6,1
vz[3]=8,2
------------------------
vz[0]= 1,3
vz[1]= 2,50
vz[2]= 6,10
vz[3]= 8,20
にしたいんですがどうやればいいんでしょうか?
0705デフォルトの名無しさん
2007/06/08(金) 21:29:250706デフォルトの名無しさん
2007/06/08(金) 21:35:20仕事で必要だから教えようとしているのに
自分で考えようとしない
会社には、ごくつぶしなんか雇う余裕は無いのに…
足を引っ張るだけの要員なんて不必要
0707デフォルトの名無しさん
2007/06/08(金) 21:49:23言いたかないが、自分で克服してこそ身につく。
あまりにも質問が酷すぎ。
0708デフォルトの名無しさん
2007/06/08(金) 21:56:12勿論一番悪いのは704だが。
0709デフォルトの名無しさん
2007/06/08(金) 22:00:500710デフォルトの名無しさん
2007/06/08(金) 22:02:150711デフォルトの名無しさん
2007/06/08(金) 22:24:500712デフォルトの名無しさん
2007/06/08(金) 22:38:38データを入力→データベースとして保持→xを入力→それがデータベースに含まれているかを
判定するプログラムを 作ってるのですがelse文がif文と一致しないというエラーが出てしまいます
なぜですか?
#include<stdio.h>
int main(void)
{
int a[99];
int n,i,x;
printf("n?");
scanf("%d",&n);
printf("data?");
for(i=0;i<n;i++){
scanf("%d",&a[99]);
}
printf("x?");
scanf("%d",&x);
{for(i=0;i<n;i++){
if(x==a[99])break;
}
printf("データベースに含まれている\n");}
else printf("含まれていない");
return(0);
}
0713デフォルトの名無しさん
2007/06/08(金) 22:44:390714デフォルトの名無しさん
2007/06/08(金) 22:46:50インデントが消えちゃって分かりにくいけど、とりあえず君のソースはこうなってる。
#include<stdio.h>
int main(void) {
for(i=0;i<n;i++){
}
{
for(i=0;i<n;i++){
if(x==a[99]) break;
}
else printf("含まれていない");
}
0715デフォルトの名無しさん
2007/06/08(金) 22:58:07http://homepage1.nifty.com/toshio-k/prog/c/
0716デフォルトの名無しさん
2007/06/08(金) 23:03:14分かりやすいサイト紹介してくれてサンキュ!
0717デフォルトの名無しさん
2007/06/08(金) 23:59:37#include <stdlib.h>
#include <stdio.h>
struct st {
int a;
};
void func(struct st* b) {
b = (struct st*)malloc(sizeof(struct st*));
printf("2.func:%p\n",b);
// free(b);
}
void main(void) {
struct st* a = NULL;
printf("1.main:%p\n",a);
func(a);
printf("3.main:%p\n",a);
}
を実行すると
1.main:00000000
2.func:00431EA0
3.main:00000000
Press any key to continue
と出力されます。次の出力
1.main:00000000
2.func:00431EA0
3.main:00431EA0
Press any key to continue
を期待していたのですが、うまくいきません。何が原因でしょうか?
0718717
2007/06/09(土) 00:01:27malloc関数に関する質問です。
#include <stdlib.h>
#include <stdio.h>
struct st {
int a;
};
void func(struct st* b) {
b = (struct st*)malloc(sizeof(struct st*));
printf("2.func:%p\n",b);
// free(b);
}
void main(void) {
struct st* a = NULL;
printf("1.main:%p\n",a);
func(a);
printf("3.main:%p\n",a);
}
を実行すると
1.main:00000000
2.func:00431EA0
3.main:00000000
Press any key to continue
と出力されます。次の出力
1.main:00000000
2.func:00431EA0
3.main:00431EA0
Press any key to continue
を期待していたのですが、うまくいきません。何が原因でしょうか?
0719デフォルトの名無しさん
2007/06/09(土) 00:02:41ポインターのポインターを使えば?
0720716
2007/06/09(土) 00:02:52スレ汚してスマソ
0721デフォルトの名無しさん
2007/06/09(土) 00:04:34void f(int x)
{
x = 5;
}
int main()
{
int i;
f(i);
printf("%d\n", i);
return 0;
}
これで5が出力されないのと同じ理由。
このコードでxをintへのポインタ型にすればいいように、
718のfuncのbも、struct st*へのポインタ型にすればいい。
0722デフォルトの名無しさん
2007/06/09(土) 00:05:44void func(struct st** b) {
*b = (struct st*)malloc(sizeof(struct st*));
printf("2.func:%p\n",*b);
// free(b);
}
void main(void) {
struct st* a = NULL;
printf("1.main:%p\n",a);
func(&a);
printf("3.main:%p\n",a);
}
こんな感じじゃないかな?
0723デフォルトの名無しさん
2007/06/09(土) 00:07:56君がやっているのはこれと同じ
これのポインタ版ってだけ
void func(int b)
{
b=10;
}
int main(void)
{
int a=0;
printf("%d\n",a);
func(a);
printf("%d\n",a);
return 0;
}
ポインタのアドレスを渡さなきゃダメ
0724デフォルトの名無しさん
2007/06/09(土) 00:32:07int *b = &a; //関数へ引数を渡すのと同じ
b = (int*)20; //bを直接触ってもaが変わるはずも無い。
0725デフォルトの名無しさん
2007/06/09(土) 00:32:50早いレスありがとう!言われてい見れば確かに721さんや723さんの言うとおりだ。
0726デフォルトの名無しさん
2007/06/09(土) 00:44:460727712
2007/06/09(土) 02:01:27とまってしまったのでヒントください。先ほどの問題をxとの差の絶対値が
最小のものだけを出力させるという方法でプログラムするのですが
その方法がわかりません。すべて出力させてしまいます。どうすればええのでしょう?
#include<stdio.h>
int main(void)
{
int a[99];
int n,i,x,c;
printf("n?");
scanf("%d",&n);
printf("data?");
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
printf("x?");
scanf("%d",&x);
for(i=0;i<n;i++){
c=x-a[i];
if(c>=0)printf("%d\n",c);
else if(c<0)printf("%d\n",-c);
}
return(0);
}
0728デフォルトの名無しさん
2007/06/09(土) 02:50:40綺麗なアイコンをBitmapで作成し、それをリソースのアイコンに貼り付けたら
色が制限され、またところどころが微妙に透過されてしょぼくなってしまいます。
一般のフリーソフトのアイコンなどは綺麗な色になってるのですが、どのようにしているのでしょうか?
一応開発環境はVisual Studio 2005でC言語を使用しています。
0729デフォルトの名無しさん
2007/06/09(土) 03:20:520730728
2007/06/09(土) 04:06:54僕の場合はベクターの画像(32*32)のスクリーンショットを取り、それをペイントに貼り付けて、
bmpファイルにして保存し、それをリソースでicoに貼り付けるといった方法をとってます。
一応ドットで描いてるわけではないので、大きい画像で作って小さく変換するのと作業的には
あまり変わらないと思うのですが、どうなのでしょうか?
0731デフォルトの名無しさん
2007/06/09(土) 05:34:10#include <stdio.h>
void bk(void) {
printf("続行するには何かキーを押してください . . .");
getchar();
}
int main(void) {
bk();
return 0;
}
ttp://www.bohyoh.com/CandCPP/C/Library/system.html
systemはstdlib.hが必要らしいが
0732デフォルトの名無しさん
2007/06/09(土) 06:02:160733デフォルトの名無しさん
2007/06/09(土) 06:06:030734デフォルトの名無しさん
2007/06/09(土) 06:09:03それだとエンター押さないと終わらない気が。
個人的にはsystem関数使うぐらいならgetch()のが気持ちが良いかも。
一応windowsでもlinuxでも用意されてるし。
linuxのgetch()はクセあるけど・・・。
0735デフォルトの名無しさん
2007/06/09(土) 07:43:41void bk(void) {
printf("続行するにはEnterキーを押してください . . .Enterキーだぞ?ちゃんと押せよ?");
getchar();
}
0736デフォルトの名無しさん
2007/06/09(土) 16:12:090737デフォルトの名無しさん
2007/06/09(土) 16:31:56Unixだと端末が普通行編集モードになってるから、そこからいじらないとダメ。
>>733
「systemなら」じゃなくてpauseがそういうコマンド。
0738デフォルトの名無しさん
2007/06/09(土) 16:38:51> 「systemなら」じゃなくてpauseがそういうコマンド。
知ってるよ、いちいちうぜーんだよ、補足しなくても良いわボケが
0739デフォルトの名無しさん
2007/06/09(土) 16:40:00揚げ足取りってうぜーよな、日ごろそういうことで他人の気分を害して
女にも相手にされずにモテねーから、こういう場所ででけぇ面して気分をよくしているんだろうね(プ
0740デフォルトの名無しさん
2007/06/09(土) 16:42:50スルーしとけよ
0741デフォルトの名無しさん
2007/06/09(土) 16:43:230742デフォルトの名無しさん
2007/06/09(土) 16:44:010743デフォルトの名無しさん
2007/06/09(土) 16:44:17だからgetchって書いてんじゃん。
cursesかncurses使うのが前提って意味だよ。
言葉足らんかったかな。
0744デフォルトの名無しさん
2007/06/09(土) 16:54:26やや、マジでこれは揚げ足取りだな。しかも「だからなに」って感じのまったく意味も無い指摘。これがゆとりってやつか。
0745デフォルトの名無しさん
2007/06/09(土) 16:55:54これはひどい
0746デフォルトの名無しさん
2007/06/09(土) 17:05:44省略しすぎで間違いの域に達してんだよカス
省略しすぎで間違いの域に達してんだよカス
省略しすぎで間違いの域に達してんだよカス
省略しすぎで間違いの域に達してんだよカス
省略しすぎで間違いの域に達してんだよカス
省略しすぎで間違いの域に達してんだよカス
省略しすぎで間違いの域に達してんだよカス
↑こいつ最高にキモメンメガネデヴピッツァw
0747デフォルトの名無しさん
2007/06/09(土) 17:07:56それまで会話をしていた人の流れを無視して勝手なことを言うタイプだよな。
んで、相手の機嫌を悪くして「何お前勝手に話しに割り込んできてんだよ?」って
相手から不快感を買って、干されて孤立するタイプなんだよねw
んで、なぜか自分が悪いのに、周りが悪いんだよ!周りが虐めるぅ〜って
被害妄想ぶっこいて最後は自殺しちゃうんだよね。
0748デフォルトの名無しさん
2007/06/09(土) 17:19:38system("pause");ってのはわかり切っていたこと。systemだけでとは誰も言っていないんだよねぇ。
やだね、早とちりして他人の気分を害する香具師って。
0749デフォルトの名無しさん
2007/06/09(土) 17:24:17ちょ、なんで決め台詞から入ってんのw
0751デフォルトの名無しさん
2007/06/09(土) 17:39:22別に、他のソフトで作成して、アイコンにしたものを取り込めば良い
0752デフォルトの名無しさん
2007/06/09(土) 17:45:38その他厨
これでFA
0753デフォルトの名無しさん
2007/06/09(土) 17:49:04例えば簡単なので 1+1 と1+2 の計算を自作関数でやらせてそれぞれの結果をメインに返す場合は
どのように書くんですか?
0754デフォルトの名無しさん
2007/06/09(土) 17:54:590755デフォルトの名無しさん
2007/06/09(土) 17:55:162.答えを格納する変数をポインタで引数として渡す
0756デフォルトの名無しさん
2007/06/09(土) 18:10:16学校ではemacsを使っているのでmeadowあたりに目をつけているのですが・・・
何かオススメのものがあったらお願いします
0757デフォルトの名無しさん
2007/06/09(土) 18:11:10それは引数ではなく返り血(ギャアッ!
0758デフォルトの名無しさん
2007/06/09(土) 18:13:09http://72.14.235.104/search?q=cache:paSHmCoCDSwJ:www.borland.com/jp/products/cbuilder/freecompiler.html+Borland+C%2B%2B&hl=ja&ct=clnk&cd=2&gl=jp&lr=lang_ja&client=firefox
> Borland C++Compiler 5.5のダウンロードは、こちら(8.46MB)をクリックして下さい。
CPad for Borland C++Compiler
ttp://www.vector.co.jp/soft/dl/win95/prog/se141451.html
0759デフォルトの名無しさん
2007/06/09(土) 18:14:430760デフォルトの名無しさん
2007/06/09(土) 18:33:510761デフォルトの名無しさん
2007/06/09(土) 18:35:390762デフォルトの名無しさん
2007/06/09(土) 18:40:46>>759さん
>>760さん
返信ありがとうございます!
一通り試してからぢれかにしようと思います
0763デフォルトの名無しさん
2007/06/09(土) 19:27:29ありがとうございます。IcoFx落としてみました。
ちょっといじったのですがなんとか出来そうなのでがんばってみます。
0764デフォルトの名無しさん
2007/06/09(土) 23:46:22現在学校の課題で、リスト構造に関する問題が出題されています。
この問題というのが、既存のリスト構造に新たなノードの生成、追加及び削除等の操作を行う、というものです。
「ノードの生成、追加及び削除等の操作」に関してはなんとかなりそうなんですが、「既存のリスト構造」を構築する手順(表記方法)がイマイチ分かりません・・・。
プログラムリストにそれらのリスト構造を記述する表記方法を教えていただけませんか?
ちなみに、リスト構造のメンバは、学籍番号、学年、名前の3つです。
0765デフォルトの名無しさん
2007/06/09(土) 23:59:270766デフォルトの名無しさん
2007/06/10(日) 00:04:11手順はアルゴリズムかなと想像できるけど、(表記方法)がつくとよくわからんね。
フローチャートでも書いてほしいのだろうか。
0767デフォルトの名無しさん
2007/06/10(日) 00:09:210768デフォルトの名無しさん
2007/06/10(日) 00:25:59僕の言う「ノードの生成」は、ノードの作成を求めるアルゴリズムを作成することができる(実際は自信ないですが・・・)という意味であって、プログラムの実行開始と同時にノードを作成するということです。
しかし、プログラムリストを作成する段階でそういったリスト構造を記述する方法が未だに分かりません。
よかったらどなたかアドバイスをいただけませんか?
たとえば↓のようなものです。
struct student{
char id[20];
char name[20];
int gakunen;
}seito={"20000403","Yojigen Taro",1};
この例だと先頭のノードしか作成することができないように思ったんですが、このようなノードを複数個作成したいと考えています。
0769デフォルトの名無しさん
2007/06/10(日) 00:30:43{"20000403","Yojigen Taro",1},
{"20000403","Yojigen Taro",1},
{"20000403","Yojigen Taro",1},
{"20000403","Yojigen Taro",1},
{"20000403","Yojigen Taro",1},
};
こういうこと?
0770デフォルトの名無しさん
2007/06/10(日) 00:35:430771デフォルトの名無しさん
2007/06/10(日) 01:14:052|#include <stdlib.h>
3|
4|struct student
5|{
6| int id[20];
7| int gakunen;
8| char name[20];
9| struct student *next;
10|}
11|struct student seito;
12|student seito[] = {
13| { 7,3,"hukuda "},
14| {13,3,"kataoka "},
15| {18,5,"sato "},
16| { 2,1,"toyoshima"},
17| {14,4,"tanikawa "},
18| };
・
・
・
・
というプログラムを作成し、実行したところ、
”エラー E2349 kadai.c 12:宣言の構文エラー”
が表示されました。やはり間違いがあるんでしょうか?
どなたか教えていただけませんか?
0772デフォルトの名無しさん
2007/06/10(日) 01:17:49ついでに上の宣言と変数名がかぶってる
0773デフォルトの名無しさん
2007/06/10(日) 01:18:4810|}
11|struct student seito;
この辺が変だとおもわないかい?
他に何の言語使えるかしらんけどさ、
Cはsyntaxなエラーを出すとき、発生点を通り過ぎて出てくる
行数が出たら、そこから上を探すと、変なところを見つけやすい
0774デフォルトの名無しさん
2007/06/10(日) 01:23:52エラーメッセージから考えるとそこは;のコピペし忘れだと思うけど。
0775デフォルトの名無しさん
2007/06/10(日) 01:32:351|#include <stdio.h>
2|#include <stdlib.h>
3|
4|struct student
5|{
6| int id[20];
7| int gakunen;
8| char name[20];
9| struct student *next;
10|};
11|struct student seito[] = {
12| { 7,3,"hukuda "},
13| {13,3,"kataoka "},
14| {18,5,"sato "},
15| { 2,1,"toyoshima"},
16| {14,4,"tanikawa "},
17| };
・
・
・
・
しかし、今度は12〜16行目において”移植性のないポインタ変換”とのエラーが表示されました。
ポインタ変換・・・って何ですか?で、どう訂正していけばいいでしょうか?
ご迷惑おかけします・・・。
0776デフォルトの名無しさん
2007/06/10(日) 01:35:18そもそも、idは配列である必要はあるのかい?
0777デフォルトの名無しさん
2007/06/10(日) 01:36:130778デフォルトの名無しさん
2007/06/10(日) 01:38:23intの配列
int
charの配列
構造体へのポインタ
}
に対して
{
7
3
"hukuda "
}
{
13
3
"kataoka "
}
:
ってもうどんだけ〜
0779デフォルトの名無しさん
2007/06/10(日) 01:41:14>777さん
すいません、勝手に余計なことしてたみたいです!^^;
どうにかエラーも消えました!
今後も質問などさせていただくかもしれないのでみなさんにも迷惑かけるかもしれませんがよろしくお願いします。
ありがとうございました^^
0780デフォルトの名無しさん
2007/06/10(日) 01:41:570781デフォルトの名無しさん
2007/06/10(日) 01:43:190782782
2007/06/10(日) 14:17:01どうしたら良いのでしょうか?
具体的に言うと↓
「問題が発生したため、xHibernate.exe を終了します。 ご不便をおかけして申し訳ありません。」
こういった感じのメッセージが出ているアプリを検出したいです。
ちなみに、その「落ちている」方のアプリは自分で作った訳ではないので手を入れれません。
よろしくお願いいたします。
0783デフォルトの名無しさん
2007/06/10(日) 14:29:27Win32 API でアプリケーションを列挙する方法
http://support.microsoft.com/kb/175030/ja
これで、xHibernate.exeがあるかどうかチェックするとか。
0784782
2007/06/10(日) 14:45:55返信ありがとうございます。
この方法だと、無理っぽいですね。
「問題が発生したため、xHibernate.exe を終了します。 ご不便をおかけして申し訳ありません。」
このメッセージが出ている間は、xHibernate.exeは存在していることになっているみたいです。
エラー報告を送信する、送信しないで、「送信しない」を選んで初めて、ウインドウが消えるみたいですね。
「問題が発生したため、xHibernate.exe を終了します。 ご不便をおかけして申し訳ありません。」
このメッセージが出ている時も「落ちている」と判断したいです。
0785デフォルトの名無しさん
2007/06/10(日) 14:52:090786デフォルトの名無しさん
2007/06/10(日) 14:52:350787782
2007/06/10(日) 14:55:50「問題が発生したため、xHibernate.exe を終了します。 ご不便をおかけして申し訳ありません。」
↑このメッセージが出ている時か、そもそもそのプロセスが存在してない時ですね。
プロセスが存在していないのを検出するだけだったらFindWindowで出来たのですが、
FindWindowだと、
「問題が発生したため、xHibernate.exe を終了します。 ご不便をおかけして申し訳ありません。」
このメッセージが出ている時も反応してしまうので・・・。
0788デフォルトの名無しさん
2007/06/10(日) 15:02:33環境依存スレ池
0789デフォルトの名無しさん
2007/06/10(日) 15:04:470790デフォルトの名無しさん
2007/06/10(日) 15:10:32カーネルモードとかじゃないと無理じゃね
0791デフォルトの名無しさん
2007/06/10(日) 16:42:380792デフォルトの名無しさん
2007/06/10(日) 16:56:06int main()
{
int kinsyu[]={10000,5000,2000,1000,500,100,50,10,5,1};
int zankin,i,mai;
i=0;
printf("給料を入力してください。:");
scanf("%d",&zankin);
while(i<10){
mai=zankin/kinsyu[i];
zankin=zankin%kinsyu[i];
printf("%s円が%d枚\n",kinsyu[i],mai);
i=i+1;
}
return 0;
}
なんですが、コンパイルはうまく
いきますが、実行してデータ入力すると
エラーが起こります。
私のソースが問題なのか
他に問題なのかのご指摘をお願いします。
初心者すぎてくだらない質問すいません。
0793デフォルトの名無しさん
2007/06/10(日) 16:58:430794デフォルトの名無しさん
2007/06/10(日) 17:00:13kinsyu[i]
ってw
0795792
2007/06/10(日) 17:07:08>>794さん
ご指摘ありがとうございます。
恥ずかしいです。
何故か、配列は%sでと勘違いしていました。
どうもありがとうございました。
0796デフォルトの名無しさん
2007/06/10(日) 17:11:550797デフォルトの名無しさん
2007/06/10(日) 17:43:52キーボードから入力された10進数を、2進数として出力するプログラムをつくりなさい。
2進数への変換は、商が0になるまで10進数を2で割りl、あまりを逆の順番で並べる方法を用いる。
ただし、入力は正の整数であって最大値は16838とする。
0798デフォルトの名無しさん
2007/06/10(日) 17:51:56こちらへ
テンプレに沿って質問してね
C/C++の宿題を片付けます 89代目
http://pc11.2ch.net/test/read.cgi/tech/1181087371/
0799デフォルトの名無しさん
2007/06/10(日) 17:56:37例、5を二進化
5 % 2 = 1
5 / 2 = 2
2 % 2 = 0
2 / 2 = 1
1 % 2 = 1
A. 101
――――
0800デフォルトの名無しさん
2007/06/10(日) 20:57:46それは要するにSEHで応対するハンドラが現れなかった状態だから
デバッガとしてプロセスにアタッチすればそういうこともWindowsから伝わってくると思う
0801デフォルトの名無しさん
2007/06/10(日) 21:33:20なんか他の言語で言うところのオーバーロードっぽいこと
やってるんですよ。
引数渡して関数呼んでんですけと、その引数が関数ポインタなんですね。
で、行った先の関数が、名前が同じでいろんな種類の関数ポインタを引数に
とりそうな見てくれしてんです。
int func_one(int a){
return a;
}
int func_two(int a,int b){
return a+b;
}
int func(int (*abc)(int,)){
return abc(100);
}
int func(int (*abc)(int,int)){
return abc(100,200);
}
int main(){
int one,two;
one=func(func_one);
two=func(func_two);
printf("one=%d two=%d\n,one,two);
return 0;
}
こんな感じ。
すいません、アドバイスください。教本みたいなのないでしょうか?
0802デフォルトの名無しさん
2007/06/10(日) 21:36:370803デフォルトの名無しさん
2007/06/10(日) 21:39:13> return abc(100);
> }
> int func(int (*abc)(int,int)){
> return abc(100,200);
> }
これ、Cだとコンパイラに怒られると思うんだけど...
元の通り?
0804デフォルトの名無しさん
2007/06/10(日) 21:41:03C でそんなことできるか?
0805デフォルトの名無しさん
2007/06/10(日) 21:43:29これCのプログラム?
int func(int (*abc)(int,)){
ってのと
int func(int (*abc)(int,int)){
って同じ名前でエラーじゃん!
0806デフォルトの名無しさん
2007/06/10(日) 21:44:23「こんな感じ」では今のコンピュータはいうこと聞いてくれないぞ
0807デフォルトの名無しさん
2007/06/10(日) 21:45:24「アドバイスください」って具体的に何のアドバイスを求めてるんだ?
0808801
2007/06/10(日) 21:47:55makefileみたらg++でコンパイルしてました。
本当にごめんなさい!!!
0809デフォルトの名無しさん
2007/06/10(日) 22:00:03何を持ってCのプログラムだと思ったのか、小一時間(ry
0810デフォルトの名無しさん
2007/06/10(日) 22:48:41別の関数でいろいろ値を格納した2次元配列を、構造体のなかに保存して、
他の関数でもその2次元配列を使えるようにしたいんです。
typedef struct INFO{
int iw,ih;
int **gazou; ←←ココ
} Info;
int main(void)
{
Info pi;
kakunou(*pi);
//ここらへんでいろいろ構造体の2次元配列を
//表示したり値を変えたりしたい。
return 0;
}
void kakunou(PNMInfo pi)
{
int g[pi.ih][pi.iw];
//ここらへんでgにいろいろ値を代入する
*pi.gazou = &g; ←←ココ
}
「←←ココ」と書いた行の2箇所をどのように書けばうまく値を受け渡すことができるんでしょうか?
(上記のはわかんないのでテキトーに書いてます)
二次元配列の時、ポインタをどういうふうに使えばいいかよく分からないんです。
よろしくお願いします。
0811デフォルトの名無しさん
2007/06/10(日) 23:07:07ごめん。
全体的におかしくて、何をどういったら良いのか分からない。
とりあえず、無理に2次元配列使おうとするより
malloc()使って1次元配列で何とかする方が良いと思うよ。
0812810
2007/06/10(日) 23:23:16とりあえず2次元配列は使いたいんですよね・・・。
で、その2次元配列を関数とか構造体と受け渡すことをしたいんです。
0813デフォルトの名無しさん
2007/06/10(日) 23:37:13とりあえず動的なサイズの2次元配列を宣言することは出来ない。
それでも2次元配列的な使い方をしたいなら考えてみるけど。
0814デフォルトの名無しさん
2007/06/10(日) 23:42:14おとなしく、仮想二次元で一次元配列を使うのがいいよ。
二次元配列風アクセスはできるけど、その手間よりも仮想二次元のほうが楽だし。
0815デフォルトの名無しさん
2007/06/10(日) 23:46:51810ではないけど、「仮想二次元」て何?
0816デフォルトの名無しさん
2007/06/10(日) 23:49:41仮想二次元でかつ二次元配列風にアクセスできるようにはできるね。
どうしても C でやりたいというなら、
何かアクセス用の関数を作ったらいい。
>>815
int n[5 * 10];
int i, j;
for(i = 0; i < 5; i++)
for(j = 0; j < 10; j++)
n[i * 10 + j] = i + j;
みたいなの。
0817デフォルトの名無しさん
2007/06/10(日) 23:49:56始めの概念を理解するとかのあたりならそれでもいいかもしれないけど
0818デフォルトの名無しさん
2007/06/10(日) 23:52:44そういう奴か。
ありがとう。
俺なりに解釈したら、こういう意味かと思った。
void kakunou(Info *pi)
{
int i,j;
pi->buf = (int *)malloc(sizeof(int) * pi->ih * pi->iw); // 画像のバッファを入れるところ
pi->gazou = (int **)malloc(sizeof(int *) * pi->ih); // 2次元的アクセスのためのポインタの配列
for(i = 0;i < pi->ih;i++){
pi->gazou[i] = &pi->buf[pi->iw * i];
}
// ココまで2次元配列の作成
for(i=0;i<pi->ih;i++){
for(j=0;j<pi->iw;j++){
pi->gazou[i][j] = i*j;
}
}
}
0819デフォルトの名無しさん
2007/06/10(日) 23:54:48>>818の上にあるコードも>>810向けに書いとこう。
#include <stdio.h>
#include <stdlib.h>
typedef struct INFO{
int iw,ih;
int **gazou; //←←ココ
int *buf;
} Info;
void kakunou(Info *pi);
void kaihou(Info *pi);
int main(void)
{
Info pi;
int i,j;
pi.iw = 10;
pi.ih = 5;
//kakunou(*pi); // ← 間違い
kakunou(&pi);
//ここらへんでいろいろ構造体の2次元配列を
//表示したり値を変えたりしたい。
for(i=0;i<pi.ih;i++){
for(j=0;j<pi.iw;j++){
printf("%3d", pi.gazou[i][j]);
}
printf("\n");
}
kaihou(&pi);
return 0;
}
0820デフォルトの名無しさん
2007/06/10(日) 23:59:11素数を調べるのにルートが必要なんです
0821デフォルトの名無しさん
2007/06/11(月) 00:01:07math.hを読み込んでsqrt。
コンパイル(ていうかリンクだが)の時に、-lmオプション。
0822デフォルトの名無しさん
2007/06/11(月) 00:06:26素数を調べるのに、一般的に√は使う必要ないがな。
0823デフォルトの名無しさん
2007/06/11(月) 00:19:15ありがとうございます
でも、<stdio.h>規制があるんです
>>822
入力した整数nが素数かどうかを判定する課題なんです
√n を 2〜n-1 で割っていくプログラムなら処理が早いと思ったんで
0824デフォルトの名無しさん
2007/06/11(月) 00:26:18別に sqrt なんて要らない。
0825デフォルトの名無しさん
2007/06/11(月) 00:29:250826デフォルトの名無しさん
2007/06/11(月) 00:32:270827デフォルトの名無しさん
2007/06/11(月) 00:36:400828デフォルトの名無しさん
2007/06/11(月) 00:44:300829デフォルトの名無しさん
2007/06/11(月) 00:47:20んなもん、ローカルの中にループの外で入れれば同じだけど。
0830デフォルトの名無しさん
2007/06/11(月) 01:11:53でも、かけ算は毎回。
ということだろう。
0831デフォルトの名無しさん
2007/06/11(月) 01:14:000832デフォルトの名無しさん
2007/06/11(月) 01:15:180833デフォルトの名無しさん
2007/06/11(月) 01:17:390834デフォルトの名無しさん
2007/06/11(月) 01:27:47CPUの命令も関わってくるだろうし。ってかそこまで気にするほどのもんじゃないと思う。
0835デフォルトの名無しさん
2007/06/11(月) 01:28:15できるだけ計算量の少ない方法で、与えられた N の平方根の整数部を求めよ。
0836デフォルトの名無しさん
2007/06/11(月) 01:31:52前回のループで判定に使った素数まではチェックなしで判定に使用して、
それ以降の部分だけかけ算使ったチェックをすれば、ほとんどかけ算せずに済む。
0837デフォルトの名無しさん
2007/06/11(月) 02:19:50for( i = 0 ; getchar(str[i]) != EOF && i < STR_MAX ; i++ )
こんな感じで書くことは出来ないんでしょうか?
エラーが出るってことは無理なんですよね
前に何かの参考書でこのような式を見たような気がしたんですけど・・・
0838デフォルトの名無しさん
2007/06/11(月) 02:20:44getcharをそこでするか?普通に str[i]!=EOFでええやろ?w
0839デフォルトの名無しさん
2007/06/11(月) 02:21:59> int getchar(void);
どう考えても使い方が不適切です、ありがとうございました。
0840デフォルトの名無しさん
2007/06/11(月) 02:27:00for( i = 0 ; str[i] = getchar() != EOF && i < STR_MAX ; i++ )
でした
0841デフォルトの名無しさん
2007/06/11(月) 02:35:49まず、演算子の優先順位。
わかんなかったら、調べるか括弧つけろ
0842デフォルトの名無しさん
2007/06/11(月) 02:42:11っつか、何がしたいのかさっぱり分からん。getcharは何に使いたいんだ?
入力を受け付けて str に入れたいのか?それとも、str の終端を見つけて
何かfor文で処理したいのか?
0843デフォルトの名無しさん
2007/06/11(月) 02:44:450844840
2007/06/11(月) 02:55:13str[i] = getchar();
で配列に文字列を入れたいんですけど、
for( i = 0 ; (str[i] = getchar()) != EOF && i < STR_MAX ; i++ )
と書いた方がコードが短くなるので良いもかと思ってました
0845デフォルトの名無しさん
2007/06/11(月) 02:58:290846デフォルトの名無しさん
2007/06/11(月) 03:00:330847デフォルトの名無しさん
2007/06/11(月) 03:05:30!= は = より優先順位が高いので
それじゃあ str[i] = (getchar() != EOF) ということになるよ
0848デフォルトの名無しさん
2007/06/11(月) 03:08:030849840
2007/06/11(月) 04:03:57#include <stdio.h>
#define STR_MAX 256
#define EOS '\0'
int main(void)
{
char buf,str[STR_MAX];
int i,a;
/* 配列に文字列を入力&ENDの判定 */
printf("a〜zのアルファベットを入力して下さい\n");
for( i = 0 ; i < STR_MAX ; i++ ){
str[i] = getchar();
if( str[i] == EOF || str[i] == '\n' ){
str[i] = EOS;
break;
}
}
/* アルファベットをソート */
for( i-=1 ; 0 <= i ; i--){
for( a = i -1 ; 0 <= a ; a-- ){
if( str[i] < str[a]){
buf = str[i];
str[i] = str[a];
str[a] = buf;
}
}
}
printf("%s\n",str);
return 0;
}
0850デフォルトの名無しさん
2007/06/11(月) 04:14:320851デフォルトの名無しさん
2007/06/11(月) 11:36:02char型の配列の先頭アドレスが2の乗数に
なっているかどうかは、性能に影響ありますか?
影響あるとしたら、
C言語で charの1次元配列を複数確保するとき、
1番目の配列の長さは2の乗数にしておいた方が
よいですか?
0852デフォルトの名無しさん
2007/06/11(月) 11:50:12>char型の配列の先頭アドレスが2の乗数に
>なっているかどうかは、性能に影響ありますか?
CPUによる(奇数アドレスへのアクセスが遅くなるCPUはある)
>C言語で charの1次元配列を複数確保するとき、
>1番目の配列の長さは2の乗数にしておいた方が
>よいですか?
コンパイラが勝手にやってくれることが多い
0853デフォルトの名無しさん
2007/06/11(月) 12:37:180855デフォルトの名無しさん
2007/06/11(月) 13:05:29そもそもアクセスできないプロセッサは普通に存在するが
2のn乗でなければ困るようなプロセッサは見た事がないな。
0856デフォルトの名無しさん
2007/06/11(月) 13:16:222の冪乗なんてアドレスを要求するようなプロセッサはないな。
それだと例えば、32ビットアドレス空間だと30箇所ほどしか高速アクセスできないことになってしまう。
#つーか、「2の乗数」で冪の意味というのは無理がありすぎ。
0857デフォルトの名無しさん
2007/06/11(月) 13:26:340858デフォルトの名無しさん
2007/06/11(月) 13:28:382のべき乗に制限される場合ってない? FFTとか
0859デフォルトの名無しさん
2007/06/11(月) 13:39:49それサンプル数の話で、しかも「自動的に」は有り得ない。
0860デフォルトの名無しさん
2007/06/11(月) 13:45:382^N FFTが一番シンプルってのはあるけど。
0861デフォルトの名無しさん
2007/06/11(月) 13:46:490862デフォルトの名無しさん
2007/06/11(月) 15:27:15これがエラーになってしまうんですが、どうのようにかいたらいいんでしょうか?
0863デフォルトの名無しさん
2007/06/11(月) 15:30:18#define XXX AAA::BBB::CCC
0864デフォルトの名無しさん
2007/06/11(月) 15:36:24あと、名前空間なら namespace XXX = AAA::BBB::CCC; と、
型なら typedef AAA::BBB::CCC XXX; とすべき。
CCC がテンプレートなら仕方がないところあるけど。
0865862
2007/06/11(月) 15:45:15しかしどうにかしてソースコード中のAAA::BBB::CCCをXXXに置き換えたいです。
無理でしょうか?
0866デフォルトの名無しさん
2007/06/11(月) 15:53:24>Cじゃなかったですね。すいません。
ではさようなら。
0867デフォルトの名無しさん
2007/06/11(月) 16:04:42namespace AAA
{
namespace BBB
{
typedef ::XXX CCC;
}
}
名前空間ならnamespace CCC = ::XXX;
関数なら::XXXを呼ぶinline関数
変数ならconst参照で我慢
クラステンプレートなら今は::XXXを継承したクラステンプレートCCCを作ってごまかす
0868862
2007/06/11(月) 16:19:58デフォルトでできてくる関数があって、これはデザイナがよむため
変更不可です。読むといってもC++として#defineやtypedefはちゃんと読むわけでは
ないみたいで、この関数内だけ見てるみたいです。
それでこの関数内でgcnew AAA::BBB::CCCがあるんですが、ここをXXXに変更すると
デザイナが読み込みできません。XXXはAAA::BBB::CCCを継承したものですが、
デザイナで適切に読ませるためのコーディングがよくわからないので放置してます。
つまりXXXも型なのでtypedefは使えないんです。
0869デフォルトの名無しさん
2007/06/11(月) 16:20:34置換はしちゃいけないわけか?
0870デフォルトの名無しさん
2007/06/11(月) 16:22:18つか、gcnew かよ。
0871デフォルトの名無しさん
2007/06/11(月) 16:23:48http://pc11.2ch.net/test/read.cgi/tech/1142147319/
こっちに行ったら。
そういう事をやっていいのかすら分からんから。
0872デフォルトの名無しさん
2007/06/11(月) 16:36:00他の奴も相手すんな。
0873862
2007/06/11(月) 16:57:18不可能みたいですが・・・
#defineはあくまでトークンレベルでしか置換できないみたいですね。
裏技があればとおもったんですが。
0874デフォルトの名無しさん
2007/06/11(月) 17:05:26あっち行け。
0875デフォルトの名無しさん
2007/06/11(月) 18:53:13char str1[STR_SIZE];
scanf("%文字数s",str1);
printf("%d\n",(strlen(str1))
OS:XP C言語の質問なんですが
scanfの文字数の部分に#defineで定義した記号定数名を入れると入力した文字数が1と表示されてしまいます
しかし直接、数値を指定してやるとちゃんとした文字数が表示されます
ここには記号定数名は使えないってことでしょうか?
そうだとちょっと不便ですね
何か良い方法ありませんか?
0876デフォルトの名無しさん
2007/06/11(月) 19:02:47scanf("%" TO_STR(STR_SIZE) "s", str1);
0877851
2007/06/11(月) 19:15:11打ち間違えてたことに気付かされました。
>>851
>char型の配列の先頭アドレスが2の乗数に
>なっているかどうかは、性能に影響ありますか?
「2の倍数」が正しいです orz
>>853
853の書き込みを見た時点で気がつくべきでした
0878デフォルトの名無しさん
2007/06/11(月) 19:20:55MinGw とか gcc は、よく使っています。Cygwin は以前使っていました。
MS 社の Visual C, C++ を使ったこともあります。
さて、今現在 MSYS + MinGw 環境で複素数演算をやろうとしたとき、どのような方法が
いいのでしょうか。/mingw/include/complex.h は見えるので、けっこう手軽にできそう
なのですが、具体的手順が Web 検索してもわかりませんでした。
よろしくアドバイスのほど、お願いします。
0879デフォルトの名無しさん
2007/06/11(月) 20:10:58Cでどうしてもやりたいのか、C++でいいのか先ずははっきりしる。
0880デフォルトの名無しさん
2007/06/11(月) 20:23:46おいお前
2の倍数=偶数だぞw
お前が言いたいのは”2のべき乗”じゃないのか?
0881デフォルトの名無しさん
2007/06/11(月) 20:39:53"どのような方法"が何を意味するか良く分からないが、Cならこんな感じか?
#include <stdio.h>
#include <complex.h>
int main(void) {
complex val0,val1,val;
val0 = 2.0 + 3.0i;
val1 = 4.0 + 5.0i;
val = val0 * val1;
printf("%.5f + %.5fi\n",val);
return 0;
}
0882デフォルトの名無しさん
2007/06/11(月) 20:39:57>856
0883デフォルトの名無しさん
2007/06/11(月) 20:43:00それなんて拡張言語?
0884デフォルトの名無しさん
2007/06/11(月) 20:44:59一応Mingwとあったんでそれで。-ansi -pedanticどちらかつけると通らんけど。
0885デフォルトの名無しさん
2007/06/11(月) 20:53:26C99
0886デフォルトの名無しさん
2007/06/11(月) 21:36:06このソースだと11行目で入力した数値が14行目で消滅するのですが
何か良い解決策はないでしょうか?
0887デフォルトの名無しさん
2007/06/11(月) 21:42:57>scanf ("%s", &ope);
これをどうにかすればいいと思うよ
0888デフォルトの名無しさん
2007/06/11(月) 21:47:32それを如何にかする方法を聞きたいのですが・・・
0889デフォルトの名無しさん
2007/06/11(月) 21:50:49もしくは
static char ope[100000000]; /* 足りねーか? */
switch (ope[0]){
0890デフォルトの名無しさん
2007/06/11(月) 21:50:57char ope[256];
scanf ("%s", ope);
switch (*ope) {
printf ("%d %c %d = %d", dat1, *ope, dat2, ans);
テキトーでいいならこれで
0891878
2007/06/11(月) 22:22:31>>879
>Cでどうしてもやりたいのか、C++でいいのか先ずははっきりしる。
いや、C より C++ のほうがずっと有利だ!とおっしゃるのなら、その理由をお教え下さい。
>>881
どうも、ありがとうございました。
#include <stdio.h>
#include <complex.h>
int main(void) {
complex val0, val1, val;
val0 = 2.0 + 3.0i;
val1 = 4.0 + 5.0i;
val = val0 * val1;
printf("(*) %g + %g * %%i\n", val);
val = val0 + val1;
printf("(+) %g + %g * %%i\n", val);
return 0;
}
これをやってみました。計算できているようです。
もう少し甘えて質問です。Web 上に、このあたりの説明・解説文書はないのでしょうか。(英語可)
見つからなかった。検索のしかたがヘタなんでしょうね。
0892デフォルトの名無しさん
2007/06/11(月) 22:30:39C++に有利な点があるとすれば、C99が普及していないということ
C99対応コンパイラよりは、少なくともstd::complexが使える程度の実装を持った
C++コンパイラのほうが多いはず。
0893デフォルトの名無しさん
2007/06/11(月) 22:38:16でも、それはC++にとってもあんまりうれしいことじゃないんだよなぁ。
C++の規格としては直接C99に対応してくれてなくてもコンパイラ自体が
C99に対応してくれてればC++からもたいていその機能を利用できるもんなんだけどなぁ。
0894デフォルトの名無しさん
2007/06/11(月) 22:49:31scanf ("%c", &ope);では想定通りに動作しません
static char opeは、習っていないので・・・
>>890
出来ました
有難う御座いました
でも、なんで[256]なんですか?
ポインタとか、よく解らない物で・・・
また、scanfのが、&opeではなくopeであるのは何故でしょうか?
というか、このソースを作るように指示してある問題は、
ポインタを使わないことが前提だったりするんですよね(そもそも、まだ習ってないですから・・・
0895デフォルトの名無しさん
2007/06/11(月) 22:59:47配列
Cでもポインタとは一応関係ない機能
0896デフォルトの名無しさん
2007/06/11(月) 23:08:02>>889とかぶるけど、ポインタがいやならこういう書き方もできる
switch (ope[0]) {
printf ("%d %c %d = %d", dat1, ope[0], dat2, ans);
ぶっちゃけ、やってることは変わんないんだけどね?
0897デフォルトの名無しさん
2007/06/11(月) 23:10:40128でも64でも10でもなんでもいい。1以下だとまずいけど。
0898デフォルトの名無しさん
2007/06/12(火) 02:20:26以下のコードが載ってるんですが一部判りません。
int main(void)
{
char *str;
int num;
printf("何文字のaを用意しますか?\n");
scanf("%d", &num);
str = (char *) malloc(sizeof(char) * (num + 1));
・
・
・
}
これで確保されたメモリの場所を表すポインタstrが得られる、とあるのですが、
判らない事も無いんですが、最後の行の「 = 」の後「 malloc( 」の前にある
(char *)←このキャスト式みたいの何なんでしょうか?
無くてもいいような気がするんですが。。。
0899デフォルトの名無しさん
2007/06/12(火) 02:24:59mallocはvoid *を返す関数。strはchar *なので型が違う代入になる。
コンパイラによってはこの型違いの代入を禁止、もしくは警告してくるのでその抑制。
というより、出来ることなら型の異なるものの演算等はないことが望ましいから。
0900デフォルトの名無しさん
2007/06/12(火) 06:47:550901デフォルトの名無しさん
2007/06/12(火) 07:26:300902898
2007/06/12(火) 08:57:17レスありがとうございます<(_ _)>
なるほどキャスト式だったんですか・・・。
でも、そうすると
str = (char) malloc(sizeof(char) * (num + 1));
こうなるような気がするんですが
(char *) の後ろにつてるアスタリスクはどういった意味なのでしょうか(・_・)?
またレスに「mallocはvoid *を返す関数」という部分がありますが、
これもアスタリスクがわからないのですが、
voidを返すというのもよくわかりません。
「voidは値を返さない」という意味ですよね?
なのにvoid型?という型が存在するのですか?、、、、難しいなぁ。
0903デフォルトの名無しさん
2007/06/12(火) 09:43:48void*はどの型のポインタにもなれる
0904デフォルトの名無しさん
2007/06/12(火) 11:21:26だからポインタだって
voidっていうのは型がないって言うくらいに理解しておけ
0905デフォルトの名無しさん
2007/06/12(火) 12:41:07おまい、ポインタ全く分かってないだろ。
まずはポインタを勉強汁。
0906デフォルトの名無しさん
2007/06/12(火) 14:59:29値 9 4 7 2 5
int型arrayの各要素は表のとおりである。キーボードから要素番号(添字)を読み込むとその要素の値を表示するプログラムを作成しなさい(arrayの各要素の値は初期化で設定)
実行結果例1
要素番号を入力:3
--------------------------
array[3]=2
実行結果例2
要素番号を入力:4
--------------------------
array[4]=5
としたいのですがプログラムを教えてください
0907デフォルトの名無しさん
2007/06/12(火) 15:01:010908902
2007/06/12(火) 16:14:24レスありがとうございます。
一応、ポインタはわかってるつもりだったんですが、まだまだだったようです。
「やさしいC」には説明がなくてよくわからないのですが、
ネットで調べた感じだと、おそらく、変数や配列に型があるように、
ポインタにも型みたいな物があるんだと想像してます。
int a;
int *Pt;
これはint型の変数a、と
「int型の数が入る変数を指す”メモリ上のアドレスを格納できるポインタを”宣言している」のであって。
ポインタ(アドレス)自体には型は無く、入るのはアドレスのみ、と考えていたんですが、
どうやらポインタ自体に型のような物があり、「int*」「char*」こんな風に表現してるようです。
いいんですよね?(゜∀゜;
でキャスト式を使って「(char*)Pt」こんな風にすると、ポインタの型が変更できる考えとります。
「ポインタに入るのは番地よって、型が無く、番地であるなら、何でも何時でも入れられる。」
こう考えていたのが間違いだったと考えてます。
str = (char*) malloc(sizeof(char) * (num + 1));
とすると↑は、malloc()関数が「void*」という型のアドレス(ポインタ)を返している(返すと決まっている)。
ポインタstrは「char*型のポインタ」?なのでvoid*型のアドレス(ポインタ)を中に格納できない。
でキャスト式を使って型変換をしている、となって合点がいきます。
これでいいんですよね(゜∀゜;?
麻奈さん説明してくれよー(´Д`;
0909デフォルトの名無しさん
2007/06/12(火) 16:24:15試しに実行してみて
char *p = 0;
int *q = 0;
p += 1;
q += 1;
printf("%p , %p\n", p, q);
0910デフォルトの名無しさん
2007/06/12(火) 17:00:51それ以外の説明は要らん。
0911デフォルトの名無しさん
2007/06/12(火) 17:02:25ポインタ変数の加算、減算とかしたことないのかな
0912908
2007/06/12(火) 17:29:03普通に通りますね。
00000001 , 00000004
こう表示されます。
・・・これはどう考えればいいんでしょうか?
なぜに4が???
ん、そうかポインタその物であるpとqに1をプラスした
そすると次の変数の番地に移動したのか・・・・な?
そうすると次の番地はchar型の場合1バイト繰り上がったって
int型の場合は4バイト繰り上がってる・・・・。
こんな・・・・ような・・・・気もするけど。。。
うーーん。
まだダメっぽい orz
>>911
したことある・・・・と思う。
まあ所詮、はじめてまだ2週間ぐらいの超初心者ですので(゜∀゜;ハハハ
0913デフォルトの名無しさん
2007/06/12(火) 17:33:08ポインタを1増やすと型のバイト数だけアドレスが増えるんだよ
int型が4バイトの場合は4増える
0914デフォルトの名無しさん
2007/06/12(火) 17:33:37…なんか他の言語経験あり?
えらく飲み込みが早い気がするんだが。
0915デフォルトの名無しさん
2007/06/12(火) 17:47:30int n;
void *p = &n;
とすれば、p は n のアドレスで初期化される。
でも、void* になってしまうと元の型が分からないので、
*p というように参照することはできない。
*(int*)p のようにキャストすれば大丈夫。
とまあ、そんな感じ。
908 ならこれで理解できると思う。
0916912
2007/06/12(火) 18:07:25VB、正確にはVBAがちょこっとできます。
あとC#もちょこっとできます、といっても売り上げをグラフにして遊んでるぐらいですが。
職場のIT担当なんですが、DQN社長にC言語マスター指令を出されたので勉強中です。
なんかサーバの勉強もして来いとか言われてるんですが、、、、管理者やらされるのかなあ(´Д`;自信ナサス
>>910
>>915
ありがとうございます<(_ _)>
なんとか判ります、少なくとも判った気になっております。
でも
char *p = 0;
int *q = 0;
これでポインタ初期化できるんですね。
初めて知りました。
てっきり
char a, *b;
b = &a;
こうしないといけない、しなければならないのかとばっかり・・・・。
まあ、こういうレベルな訳なんですが・・・(´Д`;
0917デフォルトの名無しさん
2007/06/12(火) 18:11:170 はヌルポインタ。
NULL と書いてもいいけど(というか NULL と書いた方がいいと思うけど)。
まあ、
int *p = 0;
printf("%p\n", p);
で 0 と表示されるかどうかは環境依存だがね。
0918デフォルトの名無しさん
2007/06/12(火) 18:26:430919デフォルトの名無しさん
2007/06/12(火) 18:35:530920デフォルトの名無しさん
2007/06/12(火) 18:56:58えーと、、、ヌルポインターが0でないのと、 char *p = 0が0じゃなくなるのは何か関係あるのか?
0921デフォルトの名無しさん
2007/06/12(火) 19:08:47整数の0をあらわしているわけではない。
0922デフォルトの名無しさん
2007/06/12(火) 19:18:25そもそも printf() の "%p" で void * ではないポインタを渡すこと自体、どうなの?
0923デフォルトの名無しさん
2007/06/12(火) 19:24:390924デフォルトの名無しさん
2007/06/12(火) 19:31:20(Tは任意の不完全型かオブジェクト型)
ただし、右向き変換のとき、変換後の型で境界調整がされていない場合の動作は未定義。
0925デフォルトの名無しさん
2007/06/12(火) 19:45:320926デフォルトの名無しさん
2007/06/12(火) 19:56:40可変引数に型変換も何もないわけだが。
0927デフォルトの名無しさん
2007/06/12(火) 21:08:07すまんす。
確か void* でキャストしないとダメやね。
0928デフォルトの名無しさん
2007/06/12(火) 21:36:22あ、いいのか。なんでもないです。
0929916
2007/06/12(火) 21:56:51なるほど!!
ヌルポインタ、空のポインタってのがあって、0はヌルポインタを指していたんですね。
これで合点がいきました。
「そういうもんなんだろう」ぐらいに曖昧に考えてたんで、、、。
どうも丁寧にありがとうございました。
0930デフォルトの名無しさん
2007/06/12(火) 22:06:29何言ってんの
変数に0を入れてるのに0じゃないことなんて無い
0931デフォルトの名無しさん
2007/06/12(火) 22:07:37別スレで
sizeof(int) != sizeof(void*) な環境での可変引数でヌルポ渡すのに
0 ではなく (void*)0 と明示する必要はある
って話はあった
0932デフォルトの名無しさん
2007/06/12(火) 22:19:02へぇ。ガッ
0933質問です。
2007/06/12(火) 22:19:40000.datのなかには000\n(ぜろぜろぜろ改行です。) と書いて、001.datには0001\nとかいて・・・と100までファイルを
作りたいです。
これをFILE *fp[101]とせずに、FILE *fpとして、一つだけのfpでやりたいのですがどうしたらよいか教えてほしいです。
よろしくお願いします。
0934デフォルトの名無しさん
2007/06/12(火) 22:22:230935デフォルトの名無しさん
2007/06/12(火) 22:28:59たぶんこんな感じ
#include <stdio>
int main(void)
{
FILE *fp;
int i;
char buf[20];
for(i=0;i<=100;i++)
{
sprintf(buf,"%03d.dat",i);
fp=fopen(buf,"w");
・・・・・・
・・・・・・
fclose(fp);
}
return 0;
}
0936デフォルトの名無しさん
2007/06/12(火) 22:35:450937933
2007/06/12(火) 22:43:16ありがとうございます。早速やってみます。
0938デフォルトの名無しさん
2007/06/12(火) 22:54:57>>930と>>921はどっちが正しいの?
0939デフォルトの名無しさん
2007/06/12(火) 23:05:500940デフォルトの名無しさん
2007/06/12(火) 23:11:380 になる整数式は、ポインタへのキャスト(明示的にしろ暗黙的にしろ)により、
ヌルポインタに変換される。
0 というリテラルがヌルポインタを表しているわけではない。
だから、これもヌルポインタ。
char *p = 1 - 1;
つまり、>>921 は間違い。
0941デフォルトの名無しさん
2007/06/12(火) 23:13:47どっちが正しいかは日本語の問題に思える。
C++も含め、他の言語はシラネ。
0942デフォルトの名無しさん
2007/06/12(火) 23:14:200943デフォルトの名無しさん
2007/06/12(火) 23:17:41それ以外に不適切な点はそこには1つもないぞ。
むしろ、p += 1; の方が不適切だな。
ヌルポインタへのポインタ演算は規格上どうなるか分からんのでは。
0944デフォルトの名無しさん
2007/06/12(火) 23:21:26それ、ちがってるだろ。
0945デフォルトの名無しさん
2007/06/12(火) 23:25:36char *p;
なんだからsizeof(char)だけ進むだけだろ。
void *p;
なら不適切。
0946デフォルトの名無しさん
2007/06/12(火) 23:26:32int main(void) {
char *p={"abc"};
printf("%p -%s- \n",p,p);
*p=0;
printf("%p -%s- \n",p,p);
p=0;
printf("%p -%s- \n",p,p);
return 0;
}
0947デフォルトの名無しさん
2007/06/12(火) 23:27:19( ・∀・)つ〃∩ ヘェー
0948デフォルトの名無しさん
2007/06/12(火) 23:41:46違わないよ。
0949デフォルトの名無しさん
2007/06/12(火) 23:49:310950デフォルトの名無しさん
2007/06/13(水) 00:06:40a = &b;
*a = 111;
printf("ポインタaの値は%dです。\n", *a);
これはビルドできるのに
int *a = 0;
*a = 111;
printf("ポインタaの値は%dです。\n", *a);
これはできないですね、、、。
大学でnullはできるだけ使わないようにと教授が言ってたけど
それに関係してるのかな。。
0951デフォルトの名無しさん
2007/06/13(水) 00:08:520952デフォルトの名無しさん
2007/06/13(水) 00:09:13それに関して理解していないから。
0953デフォルトの名無しさん
2007/06/13(水) 00:11:08printf("%p\n", a);でaの値を比べてみ
0954デフォルトの名無しさん
2007/06/13(水) 00:11:21アドレス自体がnull、空なんだ。
だから指してる変数が存在しない、ビルドできないと・・・。
また一つ判ったぞー。
0955デフォルトの名無しさん
2007/06/13(水) 00:15:07http://www.kouno.jp/home/c_faq/c5.html#17
0956デフォルトの名無しさん
2007/06/13(水) 00:22:31スマンが俺は嘘を教えてしまったらしい。
malloc関数はvoid *を返すがそれを代入する際にキャストは必要ない。
俺も間違って覚えていたようだ。
実際に、VCで確認したが警告等は出なかった。
ttp://ja.wikipedia.org/wiki/Malloc
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa16.html
ただ、多くのサイトで「キャストが必要」と説明されていて、実際にそう覚えている人も多いと思う。
個人的には知識の一つとして覚えておいて、するしないは周りにあわせる等でいいと思う。
俺は今後もキャストすると思う。↓みたいなミスを避けたいってのが理由。
int * p = malloc( sizeof( double ) * 100 );
0957デフォルトの名無しさん
2007/06/13(水) 00:23:290958デフォルトの名無しさん
2007/06/13(水) 00:48:26えっ?
0959デフォルトの名無しさん
2007/06/13(水) 00:55:19ポインタ以外との演算やNULLに加算とかしちゃ駄目って事のはず
0960デフォルトの名無しさん
2007/06/13(水) 01:05:360961デフォルトの名無しさん
2007/06/13(水) 01:33:33( ・∀・). | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' . V`Д´)/
(_フ彡 / ←>>960
0962デフォルトの名無しさん
2007/06/13(水) 07:37:00int *a = (int *)0x00000000;
でええのか
0963デフォルトの名無しさん
2007/06/13(水) 08:25:45うん、言われた。
nullはできるだけ使わない事
gotoは一切使わない事
do while文もできるだけ使わない事
switch文もできるだけ使わない事
どれも理由は知らない、、、けど下の3っつは何となく想像はつく。
0964デフォルトの名無しさん
2007/06/13(水) 08:33:42今後信用し続けてたりすると、いつか痛い目にあうなそれ。
「このループはどうやって、抜けたらいいんでしょうか?」
「NULLで判断しろよ」
「え? nullはできるだけ使わない事、って教授が言ってましたけど?」
「・・・??」
switchを使うとパッと見わかりやすくなるし、
コマンドラインからの引数処理は、たいていこれ使ってるぞ。
0965デフォルトの名無しさん
2007/06/13(水) 08:42:53たとえばfopen()の戻り値チェックはどうするの?
>gotoは一切使わない事
多重ループからの脱出や例外処理に移行したいときにスムーズに書けるのに?
>do while文もできるだけ使わない事
必ず一回はループに突入させなければいけないときに無駄なフラグ変数を使えと?
>switch文もできるだけ使わない事
巷に溢れるイベント処理系の関数の立場は?
どれも適材適所なので、弁えて使えばいいだけの話。
0966デフォルトの名無しさん
2007/06/13(水) 10:02:450967デフォルトの名無しさん
2007/06/13(水) 11:30:370968デフォルトの名無しさん
2007/06/13(水) 11:31:150969デフォルトの名無しさん
2007/06/13(水) 12:37:57鵜呑みにしない方がいいぞ。
ttp://www.pro.or.jp/~fuji/computerbooks/c/c.modula2.html
0970C++
2007/06/13(水) 12:45:310971デフォルトの名無しさん
2007/06/13(水) 13:22:45大学なんぞ専門学部でも無い限り基礎しか教えない。
文字列操作以外は知らなくても何とかなる。
文字列はきついので「できるだけ」と言ったのだろう。
gotoは知らなくても問題無いし、実際俺も使わないようにしてるので
禁止というのはよくわかる。
do whileも無くても問題ないしDQNが使うとバグの元になるから敬遠してるのだろう。
上級者でも疲れてたりするとたまーーに間違うし。
switchは知ってた方がいいと思うが、知らなくても力技で何とかなるし
ifで複雑な分岐をする場合に耐性がついていいと考えたのだろう。
深いネストは慣れていないと錯乱する。
深くネストするな、という議論もあるかもしれんが。
以上、勝手な想像。
0972デフォルトの名無しさん
2007/06/13(水) 13:33:200973デフォルトの名無しさん
2007/06/13(水) 15:31:11>上級者でも疲れてたりするとたまーーに間違うし。
それは上級者とは言わんなぁ。
つーか、どう間違うのか具体的なサンプル希望。
0974デフォルトの名無しさん
2007/06/13(水) 15:32:260975デフォルトの名無しさん
2007/06/13(水) 15:42:34それだと禁止する理由にならないようなw
他の言語をやってたからrepeat-until(つまりdo-whileとは逆論理)と勘違いするって言ってた香具師はいたな。
0976デフォルトの名無しさん
2007/06/13(水) 16:00:46まあ>>972だなあ
0977デフォルトの名無しさん
2007/06/13(水) 16:01:03while {} は for で代替できるが、do {} while はそうはいかん。
だが、まあ初学者に対しての話なんだから
俺も >>972 に同意しとこう。
0978デフォルトの名無しさん
2007/06/13(水) 16:16:03最初の授業の「hello world」でポインタ使わされたぜw
しかも初心者の内は「配列禁止」で全部ポインタでレポート出されたぜwww
初心者の内は配列つかっちゃダメってどうなのよ
0979デフォルトの名無しさん
2007/06/13(水) 16:23:26Cを使うならポインタ(のラッパーとも言うべき配列も含む)使いまくるべき。
中途半端な使い方するならCを使う意味がない。
0980デフォルトの名無しさん
2007/06/13(水) 16:25:20別に珍しい事じゃない、そういう入門書もすくなからずある。
まあ変わってるにはちがいないが。
0981デフォルトの名無しさん
2007/06/13(水) 18:19:32と、アセンブラから入った人間が申しております
0982デフォルトの名無しさん
2007/06/13(水) 19:49:56演算子ではなく、ベースアドレス+オフセットを使用してコーディングされています。当
然ながら、なんだってこんな面倒なことをするのか、と聞いたところ、組込のようにリソ
ースが限られた環境では、負荷を考慮してこのような手法を使用することもある、とのこ
とでした。
僕としては、今時のコンパイラなら適切に処理してくれそうなものだし、組込とはいえ今
のCPUなら大した負荷にもならないのではないか、と思っています。ただしこの考えに根
拠が有るわけではありません。
そこで質問なのですが、リソースが限られた環境では、現在でもアドレス+オフセットで
アクセスしたりするものなのでしょうか? 組込なので通常よりも更にメモリ操作が重要
になることは理解しているのですが。
0983デフォルトの名無しさん
2007/06/13(水) 20:00:50組み込みっつっても幅が広い。
今時のコンパイラ、今時のCPUといわれても・・・
0984デフォルトの名無しさん
2007/06/13(水) 20:02:10ベース+オフセット参照したときのアセンブラコードを比較すれば良いと思うよ。
構造体を一切使わず(宣言も含めて)、一貫してそうしているのなら
アライメントを制御できないコンパイラを使ってるから… というのはありえるかもしれん
0985デフォルトの名無しさん
2007/06/13(水) 20:05:00それともその部s(ry
0986デフォルトの名無しさん
2007/06/13(水) 20:15:31でも、ポインタの加減算はなにがなんでも 1byte 単位と勘違いする罠
0987982
2007/06/13(水) 20:20:41ます。ただし質問の意図はもうちょっと俯瞰的なもので、現在であっても条件によっては
このような手法が取られることが有るのかどうかが知りたい、という物でした。
アセンブラコードの比較は現在の私から敷居が高いのですが、参考になりました。尚、こ
のような手法を取ったのは、担当者の趣味も反映されているような気はします。
0988デフォルトの名無しさん
2007/06/13(水) 20:25:43static unsigned char *mem[10000000];
だけで十分じゃね?
0989デフォルトの名無しさん
2007/06/13(水) 20:30:09いや、その勘違いがないようにポインタから入った方がいいと思うんだ。
>>987
???どこが組み込みwwww
(クロス開発なんだろうけど・・・・)
0990デフォルトの名無しさん
2007/06/13(水) 20:34:27組み込みの実行環境のCPUと開発環境のPCのCPUは関係ない。
携帯とかだとスペックはかなり上がってきてるけど、
冷蔵庫とかだと、クソ低い。
下手するとOSすら乗らん。
0991デフォルトの名無しさん
2007/06/13(水) 20:36:33スレの流れからするとペンティアム4がターゲットCPUってことでいいのかな?
0992デフォルトの名無しさん
2007/06/13(水) 20:37:55Pen4が載ったシステムに組み込み?
0993987
2007/06/13(水) 20:40:09あ、勿論ターゲットの方がペンティアムです。因みにOSはVxWorksです。
ターゲットとしてはかなり高性能だと思います。入社したてなので案件の
詳細は知りません。
0994デフォルトの名無しさん
2007/06/13(水) 20:43:40俺は無理でした
0995デフォルトの名無しさん
2007/06/13(水) 20:46:10そうやってるやつと、そうやってないやつの2種類でコンパイルして、
バイナリを比較してみればいいじゃないの。
0996デフォルトの名無しさん
2007/06/13(水) 20:47:01もう少し空気嫁よ
0997デフォルトの名無しさん
2007/06/13(水) 20:48:58http://pc11.2ch.net/test/read.cgi/tech/1181735298/
0998デフォルトの名無しさん
2007/06/13(水) 20:55:25せめてアセンブリコードを出力して比較しろよ
0999987
2007/06/13(水) 21:02:551000デフォルトの名無しさん
2007/06/13(水) 21:05:3710011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。