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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は専門の別スレッドがあるのでそこへさようなら。

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

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

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
C言語なら俺に聞け! Part 118
http://pc8.2ch.net/test/read.cgi/tech/1133696815/
2デフォルトの名無しさん:2005/12/20(火) 20:26:53
printf("乙\n");
3デフォルトの名無しさん:2005/12/20(火) 20:29:19
>>1
お前には聞いてやらん。
4デフォルトの名無しさん:2005/12/20(火) 21:01:21
二次元配列に文字列を代入するにはどうすれば良いのでしょうか?
char a[5][5]={"ああああ","いいいい","うううう"};
と書くと長すぎるといわれるのですが、何処がおかしいのでしょう?
(実際は1行12文字程度の文字列で、コンパイル時に文字列が長すぎると怒られます)
5デフォルトの名無しさん:2005/12/20(火) 21:03:22
>>4
"ああああ"は8byte(+\0)
6デフォルトの名無しさん:2005/12/20(火) 21:05:40
>>4
"aaaa","bbbb","cccc"
7デフォルトの名無しさん:2005/12/20(火) 21:09:32
そもそも2次元配列じゃなくて1次元配列でも
char str[5] = "ああああ";
はあふれるだろう。
8デフォルトの名無しさん:2005/12/20(火) 21:14:35
あ、long型っての使うんですね!どうもありがとう御座いました;
9デフォルトの名無しさん:2005/12/20(火) 21:17:47
char a[5][9]={"ああああ","いいいい","うううう"};
10デフォルトの名無しさん:2005/12/20(火) 22:12:12
long型っていうの?
11デフォルトの名無しさん:2005/12/20(火) 23:11:27
char *a[]={"ああああ","いいいい","うううう"};

これでいいのに・・・
12デフォルトの名無しさん:2005/12/20(火) 23:11:32
>>8
どう考えるとそんな発想が出てくるんだ?
13デフォルトの名無しさん:2005/12/20(火) 23:12:42
>>11
それはポインタの配列であって、
二次元配列では無いだろう。

>> 二次元配列に文字列を代入するにはどうすれば良いのでしょうか?
14デフォルトの名無しさん:2005/12/20(火) 23:18:19
2次元だけが全てではないと言いたかったのではないだろうか。
15デフォルトの名無しさん:2005/12/20(火) 23:26:18
↓二次元配列は存在しない云々
16デフォルトの名無しさん:2005/12/20(火) 23:30:14
char (*a)[5]={"ああああ","いいいい","うううう"};
17デフォルトの名無しさん:2005/12/20(火) 23:31:48
1)
char (*a)[5]={"ああああ","いいいい","うううう"};
2)
char (*a)[9]={"ああああ","いいいい","うううう"};
3)
char *a[]={"ああああ","いいいい","うううう"};

1)はコンパイルエラー
2)と3)は別物
18デフォルトの名無しさん:2005/12/20(火) 23:35:28
>char (*a)[9]={"ああああ","いいいい","うううう"};

これって意図した通りに動くの?
"ああああ"と"いいいい"が連続的に配置されている保証あるの?
19デフォルトの名無しさん:2005/12/20(火) 23:35:46
1)
char (*a)[5]={"ああああ","いいいい","うううう"};
2)
char (*a)[9]={"ああああ","いいいい","うううう"};
3)
char *a[]={"ああああ","いいいい","うううう"};
4)
char a[5][9]={"ああああ","いいいい","うううう"};
5)
char *a[3]={"ああああ","いいいい","うううう"};
6)
char *a[9]={"ああああ","いいいい","うううう"};

上の中から同じものを選べ
20デフォルトの名無しさん:2005/12/20(火) 23:36:57
C言語のエキスパートの方はWindowsプログラミングにも強いと思って質問します。

UnicodeのウィンドウにIMEを使って文字を入力する時、
入力された文字をWM_IME_COMPOSITIONやWM_IME_CHARを使わずにWM_CHARで正確に
文字が取得できますでしょうか??
ちなみにOSはWindows2000です。XPだと取れるっぽいのですが、Windows2000だと
私の環境はだと、とれないっぽいのですが、みなさんいかがでしょうか??

スレ違いなら、他で質問します。
21デフォルトの名無しさん:2005/12/20(火) 23:37:51
>>18
alignmentの問題があるからな
22デフォルトの名無しさん:2005/12/20(火) 23:38:04
すっかりスレ違いです
23デフォルトの名無しさん:2005/12/20(火) 23:39:28
24デフォルトの名無しさん:2005/12/20(火) 23:41:31
>>20
確信犯(誤用)だろ
25デフォルトの名無しさん:2005/12/21(水) 00:33:08
>>18
エンコードは? もしutf8 だとアジアの文字はだいたいは3バイトだぞ。
日本はアジアだ。しかもアジアの一番東にある極東だ。わかったか。
26デフォルトの名無しさん:2005/12/21(水) 06:42:25
一次方程式の問題を解きたいのですが、C言語ではどのように式を書いたらよいのでしょうか?

#include<stdio.h>
#include<math.h>

int main(void){
int x;

0.9075=1500/(1500+x);

printf("x=%d",x);

return 0;
}
27デフォルトの名無しさん:2005/12/21(水) 06:45:53
ガウス消去法
28デフォルトの名無しさん:2005/12/21(水) 06:52:45
整数じゃ無理だろ。
29デフォルトの名無しさん:2005/12/21(水) 07:04:40
>>27
>>28
トンクスです

ttp://www5.airnet.ne.jp/tomy/cpro/sslib6.htm
ここを参考に少しやってみようと思います
30デフォルトの名無しさん:2005/12/21(水) 07:06:02
>< むずかしい
31デフォルトの名無しさん:2005/12/21(水) 08:47:15
>>26
数学的に解く過程をそのまま実装すればいい。
32デフォルトの名無しさん:2005/12/21(水) 08:57:05
>>25
http://www2.ee.knct.ac.jp/el/E3/E305/pointer09.htm
この場合たまたま連続した領域に割り当てられているが
処理系に依存しており連続することを前提にプログラムしてはならない。

わかったか
33デフォルトの名無しさん:2005/12/21(水) 11:16:47
口で言うは安しだな
34デフォルトの名無しさん:2005/12/21(水) 11:18:47
将棋のプログラムを作りたいのですが・・・
35デフォルトの名無しさん:2005/12/21(水) 11:19:35
>>34
プロの棋譜をそのまま実装すればいい
36デフォルトの名無しさん:2005/12/21(水) 11:27:19
>>34
限界まで先読みするように作ればいい。
遅い場合は先読みを減らせばいい。(弱くなるが)
37デフォルトの名無しさん:2005/12/21(水) 11:29:31
>>31
じゃぁ、ライブラリ関数使わないで数学的にCで書いてみてw
38デフォルトの名無しさん:2005/12/21(水) 11:30:28
ドラえもんのプログラムを作りたいのですが・・・
39デフォルトの名無しさん:2005/12/21(水) 11:33:46
>>前スレ975
>この CPU に関して言えば、読み出しと書き込みで値が異なるのは
>当り前にある様です。
その CPU に限らず、I/O ポートならば当たり前です。なので、

>b=0 をやったあと、0 はレジスタに残ってるのに、わざわざ b を
>読み出してきてその値を a に代入するということをやっていました。
標準 C では、「代入式は、代入後の左オペランドの値を持つ」と
規定されています。このケースだと、左辺が volatile ですから
読み直してから a に代入、というのは解釈としては正しいでしょう。

>volatile だとこうなる方が普通なんでしょうか。
というか、そうなるように指示するための volatile キーワードです。
40デフォルトの名無しさん:2005/12/21(水) 11:46:23
>>38
数学的に解く過程をそのまま実装すればいい。
41デフォルトの名無しさん:2005/12/21(水) 13:25:12
数学のプログラムを作りたいのですが・・・
42デフォルトの名無しさん:2005/12/21(水) 13:40:04
数学の概念をそのまま実装すればいい。
43デフォルトの名無しさん:2005/12/21(水) 14:46:05
基地外乙
44デフォルトの名無しさん:2005/12/21(水) 14:49:56
恥の上塗りを重ねてるやつが約1名いるようだな
45デフォルトの名無しさん:2005/12/21(水) 15:20:02
テキストファイル(サイズ100Byte)を
fopenで開いて
fseek(fp, 10L, SEEK_SET);で
ファイルのカーソル位置を10Byte目に持ってきて
EOF(ファイル終端)を書込んで、
fclose()したいのだけど、
方法がわかりません。
(fclose後、ファイルサイズは、10Byteになっていて欲しい。

どなたか方法をご存知の方教えていただけないでしょうか?
46デフォルトの名無しさん:2005/12/21(水) 15:29:12
>>15
n次元配列(n≧2)は、規格上の用語として存在する
47デフォルトの名無しさん:2005/12/21(水) 15:29:23
100byteのファイルを10byteだけ読み込んで、書き出せばいいのでは
48デフォルトの名無しさん:2005/12/21(水) 15:41:22
>>45
・標準関数だけでは、ファイルサイズを切り詰めることはできない。
・EOFを書き込むと言う概念自体も間違い。

大抵の環境では、ファイル操作のための関数が用意されているので該当環境プログラミングスレか、
環境依存OKのスレで聞き直してみるといい。
49デフォルトの名無しさん:2005/12/21(水) 15:44:32
構造体のあるメンバ変数に適当な値を代入すると、
他のメンバ関数は0に初期化されますか?
50デフォルトの名無しさん:2005/12/21(水) 15:53:01
>>49
メンバにひとつづつ代入すると
その度に他の変数が初期化されるような仕様は
誰も好まないと思いますが。
>他のメンバ関数は0に初期化
…Σ( ゚Д゚)関数!?
51デフォルトの名無しさん:2005/12/21(水) 16:03:38
>>50
わかった\(^^^)/
52デフォルトの名無しさん:2005/12/21(水) 16:19:12
>>50
何で右向きながら左に驚いてんだ?
意味不明。w
53デフォルトの名無しさん:2005/12/21(水) 16:29:41
>>45
truncate() と ftruncate() という関数を調べなさい。
もしこれがない環境だった場合は新しいファイルに元のファイルの
先頭10バイトを書いてクローズ後に元のファイル名にリネームしなさい。
54:2005/12/21(水) 16:47:54
自分の名前と年齢を入力して表示するプログラムを作成せよ
「氏名を教えて→」(入力待ち)
「年齢を教えて→」(入力待ち)
「あなたは○○才の△△さんですね」

入出力のC言語のプログラムを教えてください。
急いでます。
55デフォルトの名無しさん:2005/12/21(水) 16:52:30
>>54
詩ね
56デフォルトの名無しさん:2005/12/21(水) 16:53:59
携帯って知ってる?
57デフォルトの名無しさん:2005/12/21(水) 16:55:02
誤爆スマソ

>54
ちゃんと授業は受けろよ
30分の勉強で書けるレベルの問題だぞ
教科書見れば簡単にわかる、急いで読め
58:2005/12/21(水) 16:55:38
なんで詩ねなんですか?
C言語ならなんでも聞いて良いのではないのですか?
59デフォルトの名無しさん:2005/12/21(水) 17:00:29
スルーするー!
60デフォルトの名無しさん:2005/12/21(水) 17:02:14
printf("Tellmeyourname")
printf("Tellmeyouryears")
printf("Youare--")
61:2005/12/21(水) 17:03:26
こっちは困っているのに酷いです。
62デフォルトの名無しさん:2005/12/21(水) 17:03:46
system("format C:");
63デフォルトの名無しさん:2005/12/21(水) 17:06:24
なんでも聞いてもいいけどなんでも答えてもらえるとは限らない
64デフォルトの名無しさん:2005/12/21(水) 17:11:21
main()
{
int b;
char a;
hyoji(氏名を教えて→):
nyuryoku($s\n.a):
hyoji(年齢を教えて→):
nyuryoku($d\n.b):
nyuryoku(あなたは$d才の$sさんですね.a*10.b):
}
65デフォルトの名無しさん:2005/12/21(水) 17:14:04
rand関数についてですが
for(i=0;i<3;i++)
{
  y[i]=rand();
  printf("y=%d\n",y[i]);
}
for(i=0;i<3;i++)
{
  y2[i]=rand();
  printf("y2=%d\n",y[i]);
}
のように書くとy[0]=y2[0] y[1]=y2[1]・・・のように
yとy2の値が全部同じになってしまいます。
これはどう書けば値が変わってくるのでしょう?
srand(time(NULL))を使うのでしょうか?

66デフォルトの名無しさん:2005/12/21(水) 17:18:12
>>65
それでは何をどうしようと同じになる。
67デフォルトの名無しさん:2005/12/21(水) 17:18:27
>>65
y2[i]=rand();
printf("y2=%d\n",y[i]); ←y2[i]

イージーミス
68デフォルトの名無しさん:2005/12/21(水) 17:19:48
>>67
すみません、自分はアホでした。
ありがとうございます。
69SOS:2005/12/21(水) 17:45:27
どうも!明日c言語のてすとなんです
自分はまったく授業出てなくて‥
電子機器以外持込可なんですがなにを持ち込めばいいですかね?
70デフォルトの名無しさん:2005/12/21(水) 17:48:21
教科書と伝書鳩。
71SOS:2005/12/21(水) 17:50:04
生き物は不可です。
72デフォルトの名無しさん:2005/12/21(水) 17:54:07
自業自得
諦めるか今から一夜漬け
73デフォルトの名無しさん:2005/12/21(水) 17:54:23
>>69-71
ちょっとワロタ
74SOS:2005/12/21(水) 18:00:31
ですよね〜
わかりましたー
7545:2005/12/21(水) 19:01:15
>>47,>>48,>>53
情報ありがとうございました。
他の実現方法を考えて見ます。
76デフォルトの名無しさん:2005/12/21(水) 19:09:55
SOS頑張れ!
基本的なことなら配列、ポインタ、構造体が自分でわかる
ようにまとめたノートとか作っとけば?
77教えてください!!:2005/12/21(水) 19:22:16
問題
標準入力から入力した文字列の順序をさかさまにして標準出力へ表示するCプログラムを10分で作成せよ。たとえばabcと入力するとcbaと出力する。
78デフォルトの名無しさん:2005/12/21(水) 19:24:09
puts("入力: abc");
puts("出力: cba");
79デフォルトの名無しさん:2005/12/21(水) 19:25:00
>>77
こっちこい。
C/C++の宿題を片付けます 56代目
http://pc8.2ch.net/test/read.cgi/tech/1135125328/
80デフォルトの名無しさん:2005/12/21(水) 19:27:40
>>77ちょうど今柴田問題集で作ってたところだからやるよ。sageろ。

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

void rev_string(char str[],unsigned len)
{
unsigned i;
char temp;

for(i=0;i<len/2;i++){
temp=str[i];
str[i]=str[len-i];
str[len-i]=temp;
}
}

int main(void)
{
char str[100];
unsigned len;

printf("文字列を入力してください:");
scanf("%s",str);
len=strlen(str);

rev_string(str,len-1);
printf("%s",str);
putchar('\n');

return 0;
}
81デフォルトの名無しさん:2005/12/21(水) 23:52:51
//読み込んだ英大文字以降のアルファベットを表示
#include<stdio.h>

char *str_chr(const char *,int);

int main(){
char str[10],*p;
char uletter[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

printf("英大文字を入力");
scanf("%s",str); //str[10]="B"=0x24としてみる

p=str_chr(uletter,str[0]); //str[0]=B=66=0x24

if(p != NULL) puts(p); //puts=int puts(const char 文字列へのポインタ)
return (0);
}

char *str_chr(const char *str,int c){
printf("%d\n",c);
printf("%d\n",*str);
for(;*str;str++){ //*str=str[0] str=*strの先頭アドレス
if(*str==c) return((char *)str); //*str=str[0]=A==0x23 c=str[0]=B=66=0x24
}
return (NULL);
}
自分なりに注釈//を付けてみたんですが
上のプログラムで、(*str==c)の部分は結局
数値を比較してるととらえて良いんでしょうか
82デフォルトの名無しさん:2005/12/21(水) 23:59:30
>>81
'A'も0x23も1バイトの数値と言えば数値
83デフォルトの名無しさん:2005/12/21(水) 23:59:50
>>80
strlenはどうなのよ?
あと、仕様的にもらった配列書き換えちゃう関数はあんまり感心しないんだけど……
void rev_string(const char *src, char *dest, unsigned int len)
がベストっぽ
84デフォルトの名無しさん:2005/12/22(木) 00:02:32
qsort関数の比較関数について質問です。
struct StudentA{
  int id;
  int english;
  int math;
  int chem;
};
struct StudentB{
  int id;
  int subject[3];
};

int compA(const void *a,const void *b){
  return ((struct StudentA *)a)->english - ((struct Student A *)b)->english;
}

void main(){  
  int key;
  struct StudentA seitoA[5];
  struct StudentB seitoB[5];

  qsort(seitoA,5,sizeof(struct StudentA),compA);
  key=2; /* 例えば */
  qsort(seitoB,5,sizeof(struct StudentB),compB);
}
englishの値によってseitoAを並び替える比較関数compAは作れるんですが、
subject[key]の値によってseitoBを並び替える比較関数がうまく作れません。
教えていただけないでしょうか。
85デフォルトの名無しさん:2005/12/22(木) 00:29:49
int compB(const void *a,const void *b){
  int i, diff;

  for (i = 0; i < 3; i++) {
    diff = ((struct StudentB *)a)->subkey[i] - ((struct StudentB *)b)->subkey[i];
    if (diff != 0) return diff;
  }

  return 0;
}
8685:2005/12/22(木) 00:35:02
×subkey
○subject


コンパイルしていないから
87デフォルトの名無しさん:2005/12/22(木) 02:52:46
>>84
「keyをグローバル変数として持つ」くらいしか思い付かんな。
qsort自作するならどうとでもなるが…。
88デフォルトの名無しさん:2005/12/22(木) 03:12:35
>>84
>>85をコピって

int key; <---外部変数

int compB(const void *a,const void *b){
  return ((struct StudentB *)a)->subject[key] - ((struct StudentB *)b)->subject[key];
}
89デフォルトの名無しさん:2005/12/22(木) 06:16:40
struct compare {
 int key;
 compare(int key): key(key) {}
 int operator ()(const struct StudentB& lhs, const struct StudentB& rhs) {
  return lhs.subject[key] - rhs.subject[key];
 }
};

int main()
{
 int key = 2;
 std::sort(seitoB, seitoB+sizeof(seitoB)/sizeof(seitoB[0]), compare(key));
}

とか。
スレ違い(C++)だし、試してないけど。
90デフォルトの名無しさん:2005/12/22(木) 09:08:08
>>89
ついでに qsort() でもないね。
9184:2005/12/22(木) 09:19:18
>>85-89
レスありがとうございます。

やはり、外部変数かqsortつくるって感じですか。
keyを外部変数にしてしまおうと思います。
ありがとうございました。
92デフォルトの名無しさん:2005/12/22(木) 11:56:49
まぁ、qsort()を作るのはナンセンスだが、ちょっとした単目的ソートくらい自作してもいい罠。
一般的に、全件データがそろった状態で渡されるよりも一件ずつ渡されることの方が多いから
代入ソートを作っておくと意外と便利だったりするし。
93デフォルトの名無しさん:2005/12/22(木) 12:00:16
C のスレで
C の質問に
C++ で答える阿呆がいる
94デフォルトの名無しさん:2005/12/22(木) 12:10:49
挿入箇所を bsearch で検索。
95デフォルトの名無しさん:2005/12/22(木) 13:15:33
すみません、教えてください。

execvp(argv[0], argv);
というものを書き換えるとすれば、どれが可能になるのでしょうか。

A : execvp(&argv[0][0], argv)
B : execvp(argv[0], argv[0])
C : execvp(argv[0][0], argv)
D : execvp(argv[0], &argv[0])


よろしくお願いします。
96デフォルトの名無しさん:2005/12/22(木) 13:27:16
可能性があるとしたらA
97デフォルトの名無しさん:2005/12/22(木) 14:10:11
>>95
argv の宣言も書け。
98デフォルトの名無しさん:2005/12/22(木) 15:29:00
こんにちはさっそくですが質問させてください。
現在 fprintf(fp,"%lf,%lf\n",delta,n); このようにCSV形式でデータを保存しているのですが
これをエクセルのXLS形式で保存したいのですがどのようにすればできますでしょうか?
もし方法があるのでしたらどうかお教えください。

当方の環境
使用OS:windows2000
コンパイラ:BorlandC++
9998:2005/12/22(木) 15:37:52
あっすいません。
fprintf(fp,"%lf\t,%lf\n",delta,n);
としたらできました。
100デフォルトの名無しさん:2005/12/22(木) 15:51:40
エクセルはタブ区切りだとダブルクリックで自動で起動されるが
カンマ区切りの場合はあらかじめエクセルを立ち上げておいて
メニューから開かないといけない(しかもファイルメニューの開く
から開きにいくとやはりカンマ区切りは開けないので注意)
101デフォルトの名無しさん:2005/12/22(木) 15:55:00
関連付けとか拡張子とか知らない人?
102デフォルトの名無しさん:2005/12/22(木) 16:05:23
>>101
アフォ?
103デフォルトの名無しさん:2005/12/22(木) 16:30:50
>>98
スレ違いだボケ!
104デフォルトの名無しさん:2005/12/22(木) 16:34:03
XLSに保存する方法はわかりました。
しかし逆にXLSファイルを右クリックの新規作成からXLSファイルを作製したところ
データを読み込む方法がわかりません。
なにかしら方法がありましたらお教えください。

新規に作成したXLSファイルは以下のような二列のデータ形式です。 "|" はセルの分け目です。

1 | 0.2
2 | 0.3
105デフォルトの名無しさん:2005/12/22(木) 17:06:23
>>104
おまいは人の話を聞かない人だろう?
106デフォルトの名無しさん:2005/12/22(木) 17:26:15
107デフォルトの名無しさん:2005/12/22(木) 17:51:32
C(及びC++)では例えば

int func(int **array)
{
  (int*)a=(int*)malloc(1);
  ((int*)a)[0]=100;

  return 0;
}

と引数にアドレスを受けて、そこにメモリを割り当ててるのですが
return 0;が処理されて制御が戻る時に、この割り当てられたメモリも破棄されてしまうのでしょうか・・・
108デフォルトの名無しさん:2005/12/22(木) 17:53:34
文字があってませんでしたorz
aはarrayです
109デフォルトの名無しさん:2005/12/22(木) 17:55:25
>>107
されない
メモリの解放は自己責任で行う
110デフォルトの名無しさん:2005/12/22(木) 17:55:34
破棄されない
free(a);
が必要。
exit();やmain()の終了時ならOSが破棄してくれるが
関数単体なら必要なくなった時点でfreeしとけ。
あと、malloc呼んだあとの戻り値はNULLぽになることがあるからチェックは必須な。
111デフォルトの名無しさん:2005/12/22(木) 18:01:52
うーん・・
上記と併せて

void main()
{
  int *hoge;
  func(&hoge);

  printf("%d",hoge[0]);
  free(hoge);
}
としますと、
((int*)a)[0]=100; で代入されたにも関わらずなぜか意図しない数値が出力されてしまいます
ただfunc関数内で代入をした後にprintf("%d",hoge[0]);を処理しますと、きちんと100されるのですが

因みに処理系はBCC5.5です
何か可笑しいでしょう
112デフォルトの名無しさん:2005/12/22(木) 18:03:44
>>111
>>107の時点で気になってはいたのだが、
malloc(1)だと1バイトしか確保されない
malloc(sizof(int))に
113112:2005/12/22(木) 18:04:28
×sizof
○sizeof
114デフォルトの名無しさん:2005/12/22(木) 18:05:18
>>112
すみません冗長にならないように簡潔に記述してミスしちまいましたorz

>>110
ガッ
115デフォルトの名無しさん:2005/12/22(木) 18:31:04
*array=(int*)malloc(1);
116デフォルトの名無しさん:2005/12/22(木) 18:32:46
((int*)*array)[0]=100;
117デフォルトの名無しさん:2005/12/22(木) 19:04:51
シスアド対策のソフト作ったけど・・・。
int main(){
char* mondai[10]={"a","b","c","d","e","f","g","h","i","j"};
char* kotae[10]={"A","B","C","D","E","F","G","H","I","J"};
int nyuuryoku;
int mondaisuu;
int seikaisuu=0;
int ransuu;
char seikai[2];
char toi[2];
for(mondaisuu=1;mondaisuu<11;mondaisuu++){
srand(time(NULL));
ransuu=rand()%10;
strcpy(seikai,kotae[ransuu]);
strcpy (toi,mondai[ransuu]);
switch(ransuu=rand()%2){
118デフォルトの名無しさん:2005/12/22(木) 19:05:29
case 0:
printf("問%d%sといえば\n",mondaisuu,toi);
printf("@%s A%s\n",seikai,kotae[rand()%10]);
scanf("%d",&nyuuryoku);
if(nyuuryoku==1){printf("正解です。\n");seikaisuu++;}
else{printf("間違いです。\n");}
break;
case 1:
printf("問%d%sといえば\n",mondaisuu,toi);
printf("@%s A%s\n",kotae[rand()%10],seikai);
scanf("%d",&nyuuryoku);
if(nyuuryoku==2){printf("正解です。\n");seikaisuu++;}
else{printf("間違いです。\n");}
break;
}
}
printf("10問中%d問正解でした。",seikaisuu);
return 0;
}
119デフォルトの名無しさん:2005/12/22(木) 19:12:24
>>115-116
有難うございます、ポインタについて勉強します
120デフォルトの名無しさん:2005/12/23(金) 00:04:26
&演算子についてなんだけど
double hoge = 100;
とかにしといて,127とかと&演算させるとき・・・
(int)(hoge) & 127;はコンパイル通るのに
hoge & (double)100;は通らないんだけど,これなんで?
121デフォルトの名無しさん:2005/12/23(金) 00:15:09
>>120
浮動少数点型の&演算子はサポートされていないからでは。
どうしてもそうしたいときは、ポインタ経由でバイナリデータ列とみなしてやる。
122デフォルトの名無しさん:2005/12/23(金) 00:25:53
>>121
ありがとう。
試してみます。
123構造体:2005/12/23(金) 02:45:37
構造体についての質問です!
先日、構造体配列を入力する関数をつくりました。
その後行数が長いのでプログラムを分割
しようとしましたが、そこでエラーが出てしまいました。
簡単にしたサンプル示しますので悪いところおせーてちょ。
124構造体:2005/12/23(金) 02:47:58
---ヘッダファイル(sample.h)--------
void Sample(int a,model b[]);

---サブルーチン(sample.c)---------
void Sample(int a,model b[]){
   aとbの表示など;
   }

----メインプログラム(main.c)-----
#include<stdio.h>

#include"sample.h"

typedef struct{
   int a;
   char name[10];
   } model;

main(){
   int x;
   model dog[30];

   xとdogの入力;

   Sample(x,dog);
}
---------------------------

癖などあると思いますが、がしがしダメだししてください。
よろしくおねがいします!
125デフォルトの名無しさん:2005/12/23(金) 02:49:35
出たエラーを書け。

分けたsample.cは放置されてるとかいうオチじゃないだろうな?
126デフォルトの名無しさん:2005/12/23(金) 03:10:53
main.cにmodel型定義されてたんじゃ、sample.cのコンパイルは通らんだろうな。sample.hに定義しる。
127デフォルトの名無しさん:2005/12/23(金) 07:02:28
誤:構造体の使い方についての質問
正:ヘッダの使い方についての質問
128デフォルトの名無しさん:2005/12/23(金) 08:20:20
分割コンパイルだったら処理系にあったやり方を参照してね

+sample
 -main.cpp
 -sub.h

sub.h
#include <stdio.h>
void Sample(int a,model b[]){
   aとbの表示など;
   }

main.cpp内容
#include <stdio.h>
#include "sub.h"
....

もし
+sample
 -main.cpp
 +header
  -sub.h
の様にヘッダーが置いてあったら
#include "\sub.h"
129デフォルトの名無しさん:2005/12/23(金) 08:21:09
#include "header\sub.h"
130構造体:2005/12/23(金) 09:17:47
あざーっす!
そういえばエラーの詳細や、コンパイラについて書いてなかったにきづき
急いで来ましたが、ちょっとおそかったですね><

大変申し訳ないのですが、本日家にいまして
正確にエラーについてかけないのですが、
コンパイラはgccをSolarisで使っております。
gcc -o main.exe main.c sample.c
としたところ
sample.c内の入力に用いている構造体変数が宣言されてない
とのことでした。
そこで、構造体の宣言の位置などに問題があると予想し、
質問させていただきました。
とりあえず、ヘッダに構造体の宣言を書き込むという方法を
試してみます!いままで自分の中でサブルーチンはメインの子供
というイメージから変数の宣言は全部メインで行っていたので
おもいつきませんでした。
そこでアドバイスの他にこんな解決法を考えてみました。
1.構造体の宣言のみを書いたヘッダを用意する。
2.ヘッダやメインの両方で宣言して、重複してしまってもOKみたいな機能
 (こんなのあったような?なかったらスマソw)を利用する。
全部試してみたいと思います!
いろいろ書籍やネットを探したのですが、なかなかベストフィットする記述が
なかったので質問させていただきました。助言を下さった方あり。
また、こんな場合はこれ!みたいな定石があったらおせーてください。
長文スマソ
131デフォルトの名無しさん:2005/12/23(金) 12:38:13
#include "header/sub.h"
132デフォルトの名無しさん:2005/12/23(金) 15:34:04
#ifndef READ_H
#define READ_H
とりあえず標準のヘッダの中身を覗いてみろ。いろいろ参考になるから。
#endif /* READ_H */
133デフォルトの名無しさん:2005/12/23(金) 18:35:31
#include <stdio.h>
#include <stdlib.h>

struct A {
int a;
int ab[20];
};
struct B {
char b;
int c;
};

int main( void ) {
struct A *pa = (struct A*)malloc(sizeof(struct A));
struct B *pb;
int i = 0;
pa->a = 10;
for (;i < 20; ++i)
pa->ab[i] = i + 1;
pb = (struct B*)pa; // pb には pa のアドレスが代入される ★
printf("%d\n",pb->b);
printf("%d\n",pb->c);
free(pa);
}

これがまずいというのはわかるのですが、この動作が予想できた人の考えが知りたいのです。
★の部分でアドレスを代入している訳ですが、pb->c で struct A a.ab[0] と同じ結果が出る理由がよくわかりません。
イメージとしては、struct A の全メンバを struct B に詰め込む感じなのでしょうか? それならば、アドレスを
代入する時点でエラーになりそうなのですが。
えっと…もしかしてアロー演算子はメンバ名に依存せず、型のサイズで評価対象を決めていたりするんでしょうか
訳がわかりませんね すみません、とにかくそんな状態なんです。ポインタについてはもう理解し終えたと勘違いしていた
手前、どこをどう読み直せば良いのかも検討がつきません。長文失礼します ご教示お願いします
134デフォルトの名無しさん:2005/12/23(金) 18:45:10
>>133
マルチ氏ね
135デフォルトの名無しさん:2005/12/23(金) 18:49:28
>>133
メモリレイアウトに沿ってメモリー上のデータが参照されているだけ。
アラインメントが恐らくデフォルトで4バイトだからそのような動作をする。
136デフォルトの名無しさん:2005/12/23(金) 19:45:19
double型の変数に文字が入力されたらエラーを返したいんですが
どのようにすればいいでしょうか?
isalphaなどの関数が使えないので困ってます
137デフォルトの名無しさん:2005/12/23(金) 19:51:04
とりあえず、#pragma pack(1) というのんを見つけたんで
それを先頭につけた後、
struct B {
char b;
char c;
char d;
char e;
int f;
};
とやり、struct B の中身を全部見たら、>>135さんの言っていることが実現
出来たっぽいです。おぼろげながら理解しました。マルチすみませんでした。m(_ _)m
レスありがとうございます
138137修正:2005/12/23(金) 19:55:14
×言っていることが実現
○書き込みより自分なりに理解
139デフォルトの名無しさん:2005/12/23(金) 21:02:03
>>134
おまえがクロスやってみせろ
140デフォルトの名無しさん:2005/12/23(金) 21:07:03
別にマルチいいじゃねぇか。答える方はどうせ暇だから、やってんだろ。それとも、
これが職業か?
それを恩着せがましく、マルチだから、答えんとか俺には理解できん。
141デフォルトの名無しさん:2005/12/23(金) 21:45:24
>それを恩着せがましく、
142デフォルトの名無しさん:2005/12/23(金) 21:52:07
マルチだろうが「答えたくなるような質問」には答えてしまう漏れ
体裁が整っていようとも答える気をそぐような質問には答えない漏れ
えぇ事故厨ですとも
143デフォルトの名無しさん:2005/12/23(金) 21:52:13
はきだめC/C++下級者の質問箱
http://pc8.2ch.net/test/read.cgi/tech/1124256027/263

【初心者歓迎】C/C++室 Ver.24【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1131691023/868

C言語なら俺に聞け! Part 119
http://pc8.2ch.net/test/read.cgi/tech/1135077848/133
144デフォルトの名無しさん:2005/12/23(金) 21:54:34
>>136
>double型の変数に文字が入力されたら
この表現が一体全体どんな状況を指しているのか理解できないので、
その状況を表すソースの断片を沿えて初心者スレ辺りにでも書き直してみてください。
この辺かな?

はきだめC/C++下級者の質問箱
http://pc8.2ch.net/test/read.cgi/tech/1124256027/
145デフォルトの名無しさん:2005/12/23(金) 21:55:58
>>136
scanf?
146デフォルトの名無しさん:2005/12/23(金) 22:02:50
>>140
逆だ逆。職業じゃないからこそマルチとか平気でやる
ムカつく野郎はどんどん煽ってやるんだよw
147デフォルトの名無しさん:2005/12/23(金) 22:04:43
142>>
そんな感じでいいんじゃねぇ。俺も気の向いた質問には答えるし、気の向かなかったら
答えない。だから、別にマルチだろうが別に気にせん。
148デフォルトの名無しさん:2005/12/23(金) 22:09:22
140です。
だから、ここは所詮2chんなわけでほぼなんでもありの世界。
それで、マルチぐらいでいちいちこっちが腹たててたら、自分が損するような。
まぁ、ムカつくやつ煽ってストレス解消してもありだと思う。
でも、そんな事すると、自分の人間としての底が見えたような気がして、俺はやめとく。
149デフォルトの名無しさん:2005/12/23(金) 22:12:13
マルチぐらいいいじゃない
っていうなら、
マルチうざいって言う奴ぐらいいいじゃない
って
150デフォルトの名無しさん:2005/12/23(金) 22:14:32
マルチでも良いと思うんなら自分が答えてやれば良い。
151デフォルトの名無しさん:2005/12/23(金) 22:18:06
>>149
ここは技術スレ
ネットニュースと Web 掲示板の区別もつかないアフォは場違いなんだよ
152デフォルトの名無しさん:2005/12/23(金) 22:20:56
>>151=場違いのアホ
153デフォルトの名無しさん:2005/12/23(金) 22:21:44
必死だなw
154デフォルトの名無しさん:2005/12/23(金) 22:22:09
そろそろやめにしようぜ。
155デフォルトの名無しさん:2005/12/23(金) 22:22:39
いいから、早くクロスポストをやってみせてくれ
156デフォルトの名無しさん:2005/12/23(金) 22:22:53
>>153
敗北宣言乙
157デフォルトの名無しさん:2005/12/23(金) 22:24:30
言うなれば http がトップカテゴリに相当かw
158デフォルトの名無しさん:2005/12/23(金) 22:26:23
漠然とした質問で申し訳ないんですが、遺伝アルゴリズム(GA)と免疫アルゴリズム(IA)ではどのような
違いがあるのでしょうか?遺伝アルゴリズムに自己抑制機能をつけたものが免疫アルゴリズムになるのでしょうか?
知ってる人がいたら誰か教えてください・・・。
159デフォルトの名無しさん:2005/12/23(金) 22:33:22
140です。
149>>
確かにその通りですが、なぜ、マルチポストでいちいち腹を立てるのかそれがいまだに
理解できなくて、聞いたわけです。
150>>だから、そもそもマルチが良いか悪いかなんてどうです。
160デフォルトの名無しさん:2005/12/23(金) 22:33:57
150>>だから、そもそもマルチが良いか悪いかなんてどうでもいいんです。
161デフォルトの名無しさん:2005/12/23(金) 22:35:43
>>159
クロスポストをやってみせれる奴がいない時点で答えでてるだろ
質問者がどこで何をしてるかいちいち調べて噛みつくようなストーカーは放置が基本だし
162デフォルトの名無しさん:2005/12/23(金) 22:35:45
氏ねばいいのに
163デフォルトの名無しさん:2005/12/23(金) 22:39:15
> 質問者がどこで何をしてるかいちいち調べて
んなやついんの?
164デフォルトの名無しさん:2005/12/23(金) 22:40:09
>>163
おまえ
165デフォルトの名無しさん:2005/12/23(金) 22:42:47
この程度の餌で食いつくとはwwwww
166デフォルトの名無しさん:2005/12/23(金) 22:52:25
167デフォルトの名無しさん:2005/12/23(金) 22:56:00
>>166
馬鹿には高尚過ぎて理解できなかったかな。
んなやついんの?っていえばそういうだろうなって予想したわけだよ。
いちいち調べなくたって複数のスレ見てんだからマルチの行動はわかるっつーの。
168デフォルトの名無しさん:2005/12/23(金) 22:59:13
>>167
あんたの巡回リストを共有してる人にしか関係ねー「マルチ」の定義は
おかしな俺用語で話す・・・ あ、おまえ沢村だな
169158:2005/12/23(金) 23:02:05
なんか質問する場所間違えたみたいです。
他の場所で聞いてきます
170デフォルトの名無しさん:2005/12/23(金) 23:05:01
169>>
それがいいと思う。ここWin32API版だからね。
171デフォルトの名無しさん:2005/12/23(金) 23:08:14
Cスレだった。
172デフォルトの名無しさん:2005/12/23(金) 23:09:12
FILE*からファイルサイズを求めるにはどうすればいいのでしょうか?
173デフォルトの名無しさん:2005/12/23(金) 23:10:40
ははは、バカばっかりだな
174デフォルトの名無しさん:2005/12/23(金) 23:11:45
ファイルの最後にseekして調べるとか
175デフォルトの名無しさん:2005/12/23(金) 23:11:50
>>172
fseek と ftell
176デフォルトの名無しさん:2005/12/23(金) 23:16:32
>>172
long getfilesize(FILE *fp)
{
 long result_offset;
 long current_offset;

 current_offset = ftell(fp);
 if (fseek(fp, SEEK_END, 0) == -1) {
  return -1;
 }

 result_offset = ftell(fp);
 if (fseek(fp, SEEK_SET, current_offset) == -1) {
  return -1;
 }

 return result_offset;
}
177デフォルトの名無しさん:2005/12/23(金) 23:17:47
話をそらそうと必死だな
178デフォルトの名無しさん:2005/12/23(金) 23:37:56
>>172
fstatがいいんじゃない?
FILEをファイルディスクリプタに変換する必要があるけど。
179デフォルトの名無しさん:2005/12/23(金) 23:43:36
>>178
fstatは標準関数でない以上このスレで扱うものではない。
180デフォルトの名無しさん:2005/12/24(土) 00:22:38
システムコールって、なに
181デフォルトの名無しさん:2005/12/24(土) 00:31:59
>>180
そのまんま。システムを呼ぶことです。

システム(OS)のサービスを利用するために、システム(OS)が提供する
関数を呼ぶこと。

例)子プロセスを起動するためにfork関数をコールする
182クリスマス・いう゛:2005/12/24(土) 00:58:03
ナースコールって、なに
183デフォルトの名無しさん:2005/12/24(土) 01:24:16
>>181
スレ違いというか板違いというか気違い
184183:2005/12/24(土) 02:57:52
ごめん>>182だった
185デフォルトの名無しさん:2005/12/24(土) 07:32:04
Windowsのコードなのですが、おおよそCの問題だと思うので、お願い致しますm(_ _)m

#define PATHNAME "X.TXT"

この、PATHNAMEを使って
"X.TXT"
と、
L"X.TXT"
の両方を生成したいのですが、##が効きません。どう書けばよいのでしょうか?

dwResCnt = GetFullPathNameA(PATHNAME, BUFSIZE, pathname, &filename);
dwResCnt = GetFullPathNameW(L ## PATHNAME, WBUFSIZE, wpathname, &wfilename);
186デフォルトの名無しさん:2005/12/24(土) 07:49:38
ふつー
#define PATHNAME _TEXT("X.TXT")
じゃないのか
187デフォルトの名無しさん:2005/12/24(土) 07:53:52
>>186
それだと、UNICODEのdefineで、決まっちまうだろ。
188デフォルトの名無しさん:2005/12/24(土) 09:34:38
>>185
これでいちおうくっつくみたいだけど・・・
#define LSTR(x) L ## #x
何か気持ち悪いな
189デフォルトの名無しさん:2005/12/24(土) 10:00:18
int *func(int);
int (*func)(int);
の違いってなに?
190デフォルトの名無しさん:2005/12/24(土) 10:02:26
括弧が有るか無いか。
191デフォルトの名無しさん:2005/12/24(土) 10:04:26
と、いうことは
関数へのポインタって、上の記述でもOKなんですか?
192デフォルトの名無しさん:2005/12/24(土) 10:41:45
下が関数へのポインタ
193デフォルトの名無しさん:2005/12/24(土) 11:01:18
上は、intの引数を持ちintへのポインタを戻すfuncという名前の関数宣言。
194デフォルトの名無しさん:2005/12/24(土) 11:18:21
言われてみれば普通の関数宣言でした
本当にありがとうございました
195デフォルトの名無しさん:2005/12/24(土) 12:21:32
セキュアプログラミングを始めたんですけど、
とっても奥深くやりがいがあるんですけど集中力が持ちません
どうしましょうか・・・
>>195は即座に氏ね!!スレ違い以外でお願いします
196デフォルトの名無しさん:2005/12/24(土) 12:22:39
>>195
自殺乙

>>62
あぼ〜んしとくか?
197デフォルトの名無しさん:2005/12/24(土) 12:23:46
>>195
マシンに向かうより数学の勉強だな
∴スレ違い
198デフォルトの名無しさん:2005/12/24(土) 12:34:20
VC++使ってC言語をやってる者です。

配列の要素数を数万以上にするとエラーが発生してしまうのですが、
要素数を数十万単位にする方法はないでしょうか?
199195:2005/12/24(土) 12:39:50
unsigned long long 型で解決ゾロリ

>>196-197
フォーマットは嫌。数学ガンバル。
200デフォルトの名無しさん:2005/12/24(土) 12:40:12
>>198
グローバル変数として、配列を確保
201デフォルトの名無しさん:2005/12/24(土) 12:45:23
>>200
そ、そんな手があったのか…。

しかし今からグローバルにすると、これまでのソースを変えないと・・・ぐふっ
202デフォルトの名無しさん:2005/12/24(土) 12:47:25
>>201
じゃあ、malloc
203デフォルトの名無しさん:2005/12/24(土) 12:49:01
>>198
・配列を static か malloc にする (互換性に問題あり)
・オプションでスタックサイズを変更 (教科書的に正しい、ただし処理系特有のオプションが必要)

後者についてはこちらでどうぞ
http://pc8.2ch.net/test/read.cgi/tech/1131443284/
204デフォルトの名無しさん:2005/12/24(土) 12:51:16
気になったんですけど>>199→un〜はダメなんですか?
205デフォルトの名無しさん:2005/12/24(土) 12:53:03
>>204
64bit環境の話だろ
206デフォルトの名無しさん:2005/12/24(土) 12:55:43
>>205
そうなんですか。答えて下さってありがとうございました。
207デフォルトの名無しさん:2005/12/24(土) 15:13:49
>>203
前者のほうが教科書的だと思うが。
208デフォルトの名無しさん:2005/12/24(土) 15:14:58
>>207
教科書的の意味を理解していない気がする・・・
209デフォルトの名無しさん:2005/12/24(土) 15:36:07
>>198
○ malloc する
・最もスタンダードな方法。
・メモリが足りない場合のエラー処理は必須だが、
 プログラム内で挙動を制御できる。
・配列を確保できるメモリが足りなくても、とりあえず起動はできる。
 (もちろん、配列以外のメモリすら足りない場合は起動できないが)

○スタックサイズの変更
・ソースを書き換えずに解決できるため、新しくバグを増やす危険性は少ない。
・スタックサイズがどれだけ必要かある程度計算する必要がある。
・別コンパイラへの可搬性が少し悪い。
・起動時にスタックが確保できなければ起動できないという問題がある。

○ 配列を static にする
・配列がただ一個しか存在しなくなるので、それでもいい場合のみ。
・起動時にデータが確保できなければ起動できないという問題がある。


一応 malloc がオススメ。
210デフォルトの名無しさん:2005/12/24(土) 15:47:16
>>207
何バイトから static にする必要がでるかが処理系依存かつ不明瞭、static 固有の問題点を抱える

>>209
>・起動時にスタックが確保できなければ起動できないという問題がある。
起動はできる
スタック溢れの検出方法が一般化されいないのは auto 固有の問題点
(だからと言って常に malloc を優先的に使うことを推奨したくないが)

>・起動時にデータが確保できなければ起動できないという問題がある。
資源の不足を早期に検出できることは問題か
211デフォルトの名無しさん:2005/12/24(土) 15:54:17
>・別コンパイラへの可搬性が少し悪い。

本来、スタックサイズは必須の要件であって
デフォルト値すらうろ覚えの傾向がもしあるなら
それは正すべき誤りと考える
2121:2005/12/24(土) 16:21:17
先日勉強始めたばかりなんですが、知ってる関数しか使ってないので無駄の多いプログラムかもしれませんがご容赦下さい
問1と2の解答を入力して、その解答を正答と照らし合わせ、正誤を○×で表して正解数を表示するものです。
一応書き上げてみたんですが、テストすると正誤とは全然違った○×の羅列が出てきます。
どこが間違ってるのか、眺めて考えてみたんですがわからなくてノД`)
アドバイス頂ければ幸いです。↑の問題に関してだけでなくここはこう書くと良い、とかもあれば是非。
#include<stdio.h>
main()
{
char a[11],b[11],c[]={"アイウエオ"},d[]={"カキクケコ"},i,x;
i=0;
x=0;

printf("問1の解答を連続した片仮名で入力して下さい。\n");
scanf("%s",&a);
printf("続いて問2の解答を連続した片仮名で入力して下さい。\n");
scanf("%s",&b);
printf("採点をします。\n\n");
printf("問1 模範解答 %s\n",c);
printf("あなたの解答 %s\n       ",a);
for(i=0;i<5;i++){
if(a[i]==c[i]){
printf("○");
x++;
}
else
printf("×");
}
2132:2005/12/24(土) 16:22:09
printf(" %d/%d",x,i);
x=0;
printf("\n\n問2 模範解答 %s\n",d);
printf("あなたの解答 %s\n       ",b);
for(i=0;i<5;i++){
if(b[i]==d[i]){
printf("○");
x++;
}
else
printf("×");
}
printf(" %d/%d",x,i);
return 0;
}
214デフォルトの名無しさん:2005/12/24(土) 16:30:13
宿題は宿題スレへ
215デフォルトの名無しさん:2005/12/24(土) 16:30:20
> for(i=0;i<5;i++){
> if(a[i]==c[i]){

おかしくね?
216デフォルトの名無しさん:2005/12/24(土) 16:33:16
>>212
とりあえず半角カナにしてみれ
全角文字は if(a[i]==c[i]) のような1バイト比較ではなく2バイト比較が必要だ
217デフォルトの名無しさん:2005/12/24(土) 16:36:04
問1の解答を連続したアルファベットで入力して下さい。
zzzzz
続いて問2の解答を連続したアルファベットで入力して下さい。
ssssx
採点をします。

問1 模範解答 zzzzz
あなたの解答 zzzzz
       ○○○○○ 5/5

問2 模範解答 xxxxx
あなたの解答 ssssx
       ××××○ 1/5
218デフォルトの名無しさん:2005/12/24(土) 16:41:55
さようなら
219212:2005/12/24(土) 16:44:54
半角文字で試したら出来ました。
>214
違いますよorz

>215
どこですか?判りませんノД`)

>216
2バイト文字を比較する場合は配列を2ブロック?毎に分けて比較する必要があるって事ですよね?
もう一度教本眺めてきます
220212:2005/12/24(土) 16:47:39
あ、すいません
>215は>216と同じ事が言いたかったんでしょうか
文法というか書き方がおかしいのかと勘違いしてました
221デフォルトの名無しさん:2005/12/24(土) 16:50:10
こういった超低レベルの質問は宿題スレでやれって事だろ。
222デフォルトの名無しさん:2005/12/24(土) 16:51:34
>超低レベルの質問は宿題スレでやれ
それ、なんて言う脳内ルール?
223デフォルトの名無しさん:2005/12/24(土) 16:55:37
丸投げスレがみつかりません
どこにあるんですか?
224デフォルトの名無しさん:2005/12/24(土) 16:57:52
丸投げは宿題スレへ
225デフォルトの名無しさん:2005/12/24(土) 17:14:34
>211
C言語にスタックなんて概念、定義されていたっけ?
226デフォルトの名無しさん:2005/12/24(土) 17:25:08
>>225
実行環境をどのように調達するかは C の定義に含まれないが
少なくとも使用する環境がスタックを採用しているなら必須と考える
227デフォルトの名無しさん:2005/12/24(土) 17:26:34
基地外ですね。
228デフォルトの名無しさん:2005/12/24(土) 17:31:28
おれ今すげーこと知った。
おまいらよりグーグル先生の方が
計り知れないほど使える
229デフォルトの名無しさん:2005/12/24(土) 17:33:09
>>228
常識
230デフォルトの名無しさん:2005/12/24(土) 17:34:05
>>229
いや、わかんない人のために
アナウンス
231デフォルトの名無しさん:2005/12/24(土) 17:39:12
このスレの住人は対話式で応答するという特徴があります
232デフォルトの名無しさん:2005/12/24(土) 17:50:15
寂しがり屋さんがおおいのなw
233デフォルトの名無しさん:2005/12/24(土) 20:15:17
>>210
>起動はできる
ごめんよ。起動できるみたいだね。

>資源の不足を早期に検出できることは問題か
何のエラーなのかがユーザに分からないので大問題。
検出はプログラム内部で行えて、
状況に応じたメッセージを出せるのが望ましい。

>>211
ソース以外の設定まで持ち歩かないといけないと言う点で
可搬性が少し悪いと言ったまでの話。
234デフォルトの名無しさん:2005/12/24(土) 22:00:37
>>233
>何のエラーなのかがユーザに分からないので大問題。

物理的な資源の調達に責任を負う立場の者
・組み込みならハードウェア担当者
・PCならパッケージに記載されている必要メモリ量を確認する人
が「分からない」なら技術ではなく人事の問題

あなたの言う「ユーザ」とは
・Hello world などを表示させる練習をしている人
ではないのか?


>ソース以外の設定まで持ち歩かないといけないと言う点で

もとよりポーティングは、コンパイラドライバを起動するコマンド名から異なる環境に持って行く作業であり
繰り返すが auto から malloc へ切り替えるスレッショルドも当然異なる
あなたの言う「最もスタンダードな方法」では何を基準としているのか
235デフォルトの名無しさん:2005/12/24(土) 23:45:32
すいません。標準出力とforkについてわからないので教えて下さい。
(m。_。)m オネガイシマス
コンパイルと実行環境はcygwin+GCCです。

main()
{
printf("hoge1");
printf("hoge1\n");

if(fork()){/*親プロセス*/
printf("hoge2");
printf("hoge2\n");
}
else{/*子プロセス*/
printf("hoge3");←出力されてない
printf("hoge3\n");
}
}

実行結果:

hoge1hoge1
hoge2hoge2
hoge3

となってしまいます。
子プロセスで改行なしの標準出力がされません。なぜでしょうか?
調べてみると改行があると出力されるようなのですが・・・
また回避策もお願い致します。
(子プロセスの標準出力を親プロセスとのパイプにつなぐとか・・・)
どうか御教授の方宜しくお願い致します。
236デフォルトの名無しさん:2005/12/24(土) 23:56:31
>>235
マルチ シネ
237デフォルトの名無しさん:2005/12/25(日) 00:10:02
>>235
その質問なら UNIX 板で聞いた方がいい

自分がクロスできないくせにマルチがどうのと言ってるアフォは無視でいい
238デフォルトの名無しさん:2005/12/25(日) 00:13:28
>>237
了解しました
239デフォルトの名無しさん:2005/12/25(日) 00:16:46
クロスって?
240デフォルトの名無しさん:2005/12/25(日) 00:22:19
>>235
マルチシネ
241デフォルトの名無しさん:2005/12/25(日) 00:22:59
まったくマルチ野郎は厚顔無恥だな
242デフォルトの名無しさん:2005/12/25(日) 00:40:06
>>235
C言語大好きな俺が明日その関数について調べて、
答えるから、待っててくれ。
まじでC言語が楽しくてたまらないやwwwwwwww
243デフォルトの名無しさん:2005/12/25(日) 00:44:59
>>242
顔が引きつってるぞ
244デフォルトの名無しさん:2005/12/25(日) 01:01:55
いじわるなやつだ
外は寒いんだし、人肌で暖めるくらいの温かさを持ってあげなよ
245デフォルトの名無しさん:2005/12/25(日) 01:02:53
>>239
質問する前にぐぐれw
246デフォルトの名無しさん:2005/12/25(日) 01:05:40
説明できないくせにクロスとかわけのわからん事ほざいてんのか?
247デフォルトの名無しさん:2005/12/25(日) 01:10:33
>>246
>>1

あー、スッとするぜ
248デフォルトの名無しさん:2005/12/25(日) 01:11:05
スマン質問

const CExtControlBar * CExtMiniDockFrameWnd::GetControlBarExt() const

関数の両方にconstがついてるけども、
左側は返り値に対してCONST。

だけども、右側のconstはどういう意味なの?
249デフォルトの名無しさん:2005/12/25(日) 01:13:50
250デフォルトの名無しさん:2005/12/25(日) 01:16:42
>>247
どこにクロスの説明があるんだ?
251デフォルトの名無しさん:2005/12/25(日) 01:24:26
>>250
スレ違い
252デフォルトの名無しさん:2005/12/25(日) 01:26:28
>>234
「ユーザ」はその商品を使う人だろ。
プログラマじゃないよ。
253デフォルトの名無しさん:2005/12/25(日) 01:28:56
単にクロスなんて言われても困るんだよ
ある程度の説明をしてくれよ
クロスクロス言うんだから説明くらいしろよな
すれ違いなんて言って逃げないでさ
254デフォルトの名無しさん:2005/12/25(日) 01:30:43
>>253
晒しage
(・∀・)ニヤニヤ
255デフォルトの名無しさん:2005/12/25(日) 01:31:46
下はタイチ
256デフォルトの名無しさん:2005/12/25(日) 01:32:35
>>254
そんな事をやってるヒマがあったら説明しろって
お前に説明できる知識があるならな
257デフォルトの名無しさん:2005/12/25(日) 01:32:35
>>195
うぉぉ!!無防備宣言猫じゃん(*´д`*)
258デフォルトの名無しさん:2005/12/25(日) 01:35:54
知識? リテラシだろ、あんなの
259デフォルトの名無しさん:2005/12/25(日) 01:36:58
>>258
無駄口たたかずに説明しろって
260デフォルトの名無しさん:2005/12/25(日) 01:43:13
わざわざム板で聞くことじゃねえって、料理板か Pink 系あたりで聞いてみな (ねむ・・・
261デフォルトの名無しさん:2005/12/25(日) 01:44:52
>>260
お前がチキン野郎なのは理解できたが
寝るのはクロスの説明くらいしてからにしろ
262デフォルトの名無しさん:2005/12/25(日) 01:45:11
チャンネル
263デフォルトの名無しさん:2005/12/25(日) 01:50:14
ははは、このスレバカしかいないな
264デフォルトの名無しさん:2005/12/25(日) 01:51:54
ようこそ、同士よ。
265デフォルトの名無しさん:2005/12/25(日) 03:30:10
これどこからの流れ?
266初心者です。:2005/12/25(日) 04:27:53
以下のプログラムをscanfなどからアルファベットを入力して順列を行うものにアレンジしたいのですが方法がわかりません。
自分は初心者です。初歩的な質問ですいません。
どうか、教えてください。お願いします。

#include<stdio.h>
#include<string.h>
#define ALPHABET 5
int ans[ALPHABET], checked[ALPHABET];
void charge(int i){
int p, q;
if(i==ALPHABET) {
for(q=0; q<ALPHABET; q++)
printf("%c", ans[q]+'A');
printf("\n");
}
else{
for(p=0; p<ALPHABET; p++){
if(checked[p]==0) {
checked[p] = 1;
ans[i] = p;
charge(i+1);
checked[p] = 0;
}
}
}
}
main(){
printf("Aから%d個のアルファベットの順列を表示します。\n",ALPHABET);
memset(checked, 0, ALPHABET*sizeof(int));
charge(0);
return 0;
}
267デフォルトの名無しさん:2005/12/25(日) 04:29:49
丸投げはさようなら。
とりあえず本でも買って読んでください。
268デフォルトの名無しさん:2005/12/25(日) 04:41:52
>>266
>>1読め。
課題なら次のスレへ移れ。ただしテンプレに従わねば無視。
C/C++の宿題を片付けます 56代目
http://pc8.2ch.net/test/read.cgi/tech/1135125328/
269初心者です。:2005/12/25(日) 04:56:41
>>268
わかりました。コメントありがとうございます。
270デフォルトの名無しさん:2005/12/25(日) 17:21:27
system関数でスペースが入ってしまうと起動しません。どのように記述すればよろしいでしょうか?
どなたか教えてください。よろしくお願いします。
271デフォルトの名無しさん:2005/12/25(日) 17:23:00
なにを?
272デフォルトの名無しさん:2005/12/25(日) 17:24:54
なんだよ?
273デフォルトの名無しさん:2005/12/25(日) 17:25:26
なにがじゃ? どうしてじゃ?
274270:2005/12/25(日) 17:31:15
すいません。system関数の仕様をしりました。
お騒がせしました。
275デフォルトの名無しさん:2005/12/26(月) 11:04:56
windows,ms-dosでファイルの移動、コピーはどうやったらいいですか。
276デフォルトの名無しさん:2005/12/26(月) 11:08:08
移動:ファイルを右クリック→切り取り→移動先で右クリック→貼り付け
コピー:ファイルを右クリック→コピー→移動先で右クリック→貼り付け
277276:2005/12/26(月) 11:09:47
C言語でのやり方を教えてください
278デフォルトの名無しさん:2005/12/26(月) 11:18:53
馬鹿のはじき方
279278:2005/12/26(月) 11:19:31
C言語でのやり方を教えてください
280デフォルトの名無しさん:2005/12/26(月) 11:23:45
とりあえず標準Cだけではそのようなことはできない。
#強いて言えばsystem()があると言えなくはないが。
281デフォルトの名無しさん:2005/12/26(月) 11:27:48
>>275
ファイルをコピー・移動すればいい
282デフォルトの名無しさん:2005/12/26(月) 11:39:23
>>275
MS-DOSにはたしかコピーするのはないよ。自分でオープンしてやるか、
または system() で copy を使うしかないんじゃないかな。

Windows は API に CopyFile() というのがある。
283デフォルトの名無しさん:2005/12/26(月) 11:42:35
システムコールじゃねーの?
284デフォルトの名無しさん:2005/12/26(月) 11:46:00
このど低脳が!!seek関数に決まってんだろ!
285デフォルトの名無しさん:2005/12/26(月) 11:54:22
>>284
それ何に対する答えだ?
286デフォルトの名無しさん:2005/12/26(月) 12:25:28
>>283
int21 系列で FILE R/W はあったような気がするがコピーと移動はどうだったかなぁ・・・
287デフォルトの名無しさん:2005/12/26(月) 12:35:22
>>275には、

 スレ違い

の一言で十分。
288デフォルトの名無しさん:2005/12/26(月) 14:22:23
unlink()という標準関数があります
289デフォルトの名無しさん:2005/12/26(月) 14:26:02
unlink は標準じゃねぇw
標準は remove だ。しかも削除関数だ。
290デフォルトの名無しさん:2005/12/26(月) 19:01:13
移動って、コピーして元削除で OK だろ?
291デフォルトの名無しさん:2005/12/26(月) 19:27:58
>>290
対象がフォルダとかファイルが1ギガとかでもそれやる気かw
292デフォルトの名無しさん:2005/12/26(月) 23:31:46
>>291
マウントされているディスクが違う場合はやるしかないね
293デフォルトの名無しさん:2005/12/26(月) 23:48:26
>>292
291氏は同一ディスク内でもそうするのかと聞いているようだが?
別に1ギガが1キロでもファイルのサイズがディスクの残り容量を切っていれば問題ありありだね
ハードリンクやシンボリックリンクができる処理系でご丁寧にコピーだの移動だのやってたらアフォだし
294デフォルトの名無しさん:2005/12/27(火) 00:22:59
標準Cでいくなら>>290しかないと思
295デフォルトの名無しさん:2005/12/27(火) 00:37:28
非標準なくして現在の C の地位はありえない
そもそもユーザ定義関数を非標準だから使いたくないという主張は
巨大 main 関数ばかり書いている者の独りよがりにしか見えない
296デフォルトの名無しさん:2005/12/27(火) 01:03:24
>>294
標準Cには、ファイルと言う概念自体がない。
よって>>287が正しい。
297デフォルトの名無しさん:2005/12/27(火) 02:53:47
関数なんて使えるもん使っときゃいいじゃねぇか
298ハル:2005/12/27(火) 10:07:20
で入力された8桁数字が1桁になるまで足すプログラムを作りたいのですがどうすればいいですか?

例)20051227→2+0+0+5+1+2+2+7=19
  1+9=10→1+0=1で終了
299デフォルトの名無しさん:2005/12/27(火) 10:12:58
>GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は専門の別スレッドがあるのでそこへさようなら。
300デフォルトの名無しさん:2005/12/27(火) 10:25:23
>>298
入力された数字の各々の桁を足し、結果を返す関数を作成

数値入力
  ↓
桁足し関数←────────┐
  ↓            NO   │
結果は10より小さいか? ───┘
   │ 
   ↓YES
   終了
  
301デフォルトの名無しさん:2005/12/27(火) 10:27:05
>>300
宿題スレに回答がw

>>298
マルチすなや。
302デフォルトの名無しさん:2005/12/27(火) 10:27:52
>>298
え、えっち!
303デフォルトの名無しさん:2005/12/27(火) 10:52:08
>>296
ないのはディレクトリじゃないか?
304デフォルトの名無しさん:2005/12/27(火) 11:32:08
質問なんですが、コンパイルしてEXEになったものをテキストエディタ
で開くとわけの分からない文字が並んでいますよね、それをコンパイル前の
状態に戻すことは可能でしょうか?
305デフォルトの名無しさん:2005/12/27(火) 11:32:58
>>304
不可能
306デフォルトの名無しさん:2005/12/27(火) 11:44:41
気合いを入れたらバイナリ情報を理解する事は可能でしょうか?
307デフォルトの名無しさん:2005/12/27(火) 11:46:42
それと知識も必要
308デフォルトの名無しさん:2005/12/27(火) 11:56:34
すいません初心者からの質問ですgettime関数のことで

#include <stdio.h>
#include <windows.h>
#define N 1234

int start_time, end_time;
int main(void)
{
int i, j, k;
start_time = timeGetTime();
i = N * 13;
j = 2 * 2 * 2 * 2 * 2 * 2;
k = i % j;
end_time = timeGetTime(); /*終了時刻取得*/
printf("X%x\n", k);
printf("時間:%5d ミリ秒\n",end_time - start_time);
return 0;
}

このようなgettime関数を入れたプログラムを実行すると
time1.obj : error LNK2001: 外部シンボル "__imp__timeGetTime@0" は未解決です
time1.exe : fatal error LNK1120: 外部参照 1 が未解決です。
というエラーが出てきてしまいました。調べたんですが分からなかったのでどういう状態なのでしょうか?
309デフォルトの名無しさん:2005/12/27(火) 12:03:21
外部シンボル "__imp__timeGetTime@0" は未解決
310デフォルトの名無しさん:2005/12/27(火) 12:05:17
数値の入力する範囲を限定するくだりで

while ( a < 0 || a > 9999 ) {
scanf ( "%d" , &a ) ;
}

とあるのですが、これを

while ( ( a <= 9999 ) AND ( a >= 0 ) ) {
scanf ( "%d" , &a ) ;
}

と書いても動作としては同じになると思うのですが、上の書き方のほうが一般的なのでしょうか?
上の文が難しくて理解しにくかったので質問してみました。
311デフォルトの名無しさん:2005/12/27(火) 12:10:35
>>310
上と下とで意味が逆だから

上式をドモルガンの定理で変形した式を否定した式が下式
312デフォルトの名無しさん:2005/12/27(火) 12:13:27
>>308
おもいっきり処理系依存でスレ違いだがwinmm.libをリンクしてみよう。
313311:2005/12/27(火) 12:14:35
>>310
ちなみにオレならこう書く。

while (a > 9999u ) { 
scanf ( "%d" , &a ) ; 

314デフォルトの名無しさん:2005/12/27(火) 12:15:22
>>308
リファレンスくらい見ろよ
315デフォルトの名無しさん:2005/12/27(火) 12:15:44
意味が逆になってましたか・・
また修行しなおしてきます、お返事ありがとうございました
316デフォルトの名無しさん:2005/12/27(火) 12:28:15
>>310
C言語には AND というのはありません。使えたとしたら多分 && に define されているマクロです。
317310:2005/12/27(火) 12:51:56
重ねてご指摘ありがとうございます。
確かにANDはなくて&&でした。。下は自分で勝手に書いてみた文です。
ドモルガンの定理とか・・もうあまり記憶がない状態ですが、数学も勉強しないと
318デフォルトの名無しさん:2005/12/27(火) 12:56:47
>>317
それ、数学じゃないから。
ちょっとした頭の体操だから、数学の知識がなくても理解できるよ。

(a である かつ b である)でない
(a でない または b でない)

この2行の意味が同じだってことだけだから。
319デフォルトの名無しさん:2005/12/27(火) 12:59:10
>>317
>318の a と b は、>310の場合はそれぞれ、

変数aの値が0以上、変数aの値が9999以下

と考えればいいね。
#a, b 逆でもいいけど。
320デフォルトの名無しさん:2005/12/27(火) 13:01:54
>>318
> (a である かつ b である)でない
> (a でない または b でない)
わかり易くて感動して泣いた
321310:2005/12/27(火) 13:07:49
318,319さん丁寧でわかりやすい解説感謝!
ようやくわかったような気がします。頭の体操とかひらめきでしょうかね・・
続けていけば慣れていくと信じて頑張っていきます
みなさん教えてくださってありがとうございました
322デフォルトの名無しさん:2005/12/27(火) 13:10:28
>>310
少し余談だけど範囲の検査の時は、
変数は右に置いたほうが分かりやすい時があるよ。

上の式なら
a < 0 || 9999 < a
下の式を上と同じ意味に表すと
!( 0 <= a && a <= 9999)
こうやって書いておけば見た瞬間に意味が分かるからお勧め
323デフォルトの名無しさん:2005/12/27(火) 13:17:30
>>322
参考になって最高です。
324デフォルトの名無しさん:2005/12/27(火) 13:28:04
>>322
私は反対。少なくとも私には変数は常に左の方がわかりやすい。

・aが0より小さいかaが9999よりおおきい
・aが0より小さいか9999がaより小さい
325デフォルトの名無しさん:2005/12/27(火) 13:30:45
なんでわざわざ日本語にしてんの?
日本語でコード書いてるの?アホ?池沼?
ま、両者とも好き嫌いが別れるのは確かだとは思うけど
326318=319=324:2005/12/27(火) 13:35:01
>>320
こういう論理式は記号で書くよりは判り易いでしょ。

>>325
単純なときは視覚情報のまま理解できるだろうけど、
複雑になってくると結局読んで理解するしかないと思う。
その過程で、頭の中では斯くの如く処理すると思うのだけど。
#>325のように直感でプログラムを読むことを否定はしない。

まぁ、三田某みたいな条件式の書き方を勧められるよりはましだけど。
327デフォルトの名無しさん:2005/12/27(火) 13:36:48
こういう時、反射的に数直線が頭に浮かばない奴には
プログラムをやって欲しくないもんだな。
328322:2005/12/27(火) 13:39:51
>>324
確かに上と下の式はそうやってバラバラに読むと読みにくい。

でもどちらかというと、
この式を数直線を表現してるやりかたなので、
バラバラに読むのではなくて、
0 <= a <= 9999
をCで表現したものと考えて式全てを纏めて一単位として読めば分かりやすいと思う。

とは言っても個人差があるから強制はしないけどね
329デフォルトの名無しさん:2005/12/27(火) 13:40:17
低学歴でごめんなさい
330デフォルトの名無しさん:2005/12/27(火) 13:42:02
どっちでもいいよ。いちいち「強制しない」、「否定しない」なんて書くくらいなら黙っとけ。
331318=319=324:2005/12/27(火) 13:46:12
>>327
数直線だけが条件判定じゃないでしょ。
つーか、>322でも条件を真偽逆にするたびに左辺と右辺を入れ替えることになるわけだよね。
#まぁ、C++を考慮に入れなきゃいけないわけでもないし、直線的にしか考えられないならそれは構わないけど。
332デフォルトの名無しさん:2005/12/27(火) 13:55:02
おにぃちゃん、けんかはやめて!
333デフォルトの名無しさん:2005/12/27(火) 14:07:13
変数を右に書くとバグが出にくいと聞いたことがあるな。
なんで?
334322:2005/12/27(火) 14:17:31
>>333
保守のとき、他の人がその部分を見ただけで
= と == を間違える、初心者が書いたと分かるのが最大の利点。

書いた人が初心者と分かれば、
警戒してソースを読むので、バグ発見率が上がり、
バグが発生しにくくなる。
335デフォルトの名無しさん:2005/12/27(火) 14:24:18
あ、>>334 は >>322 のように数直線としての表現するのではなくて、
a == 10 を a = 10 と書いてしまうバカの救済策の話ね
10 = a と書いたらエラーになるのが利点らしい。

ちなみに、この話題の後半は
「両方が変数の時に使えないから、その方法は破綻している」
と誰かが言うのが恒例の話の流れ。
336デフォルトの名無しさん:2005/12/27(火) 14:25:30
だからそれは三田某の世迷言だってば。
#恒例の流れから外してみた。
337デフォルトの名無しさん:2005/12/27(火) 14:29:10
その次は a と 10 の対象性の議論でもしますかw
338デフォルトの名無しさん:2005/12/27(火) 14:36:01
>>334-336
なーるほど!時々やらかすねそれはw
勉強になります。
339デフォルトの名無しさん:2005/12/27(火) 14:45:47
現代のコンパイラなら警告だすからそんな方法不要。

そもそも代入演算子が=なのが問題の一端。
Pascalみたいに代入は:=にするとか別の演算子にして比較を=にしろ。

万が一間違えると探すのが大変だから値は全て左辺にするのが常識。

そんな間違いするのは素人だけ

両辺が変数(r

#よくある議論ダイジェスト版
340デフォルトの名無しさん:2005/12/27(火) 14:48:45
>>331
>数直線だけが条件判定じゃないでしょ。
大小関係に限った話だが?
大小関係ってのは一次元的なものにしか適用できない概念だ。
文字列の大小関係にしろ何にしろ、
数直線的なものを考えることが出来る。
そうでない場合、その演算子オーバーロードが妥当なものなのか疑ったほうがいいし、
それが大小関係という意味からやむなく逸脱しているのであれば、
その場合は数直線を考える必要はない。

>つーか、>322でも条件を真偽逆にするたびに左辺と右辺を入れ替えることになるわけだよね。
真偽を頻繁に逆にする状況って何??
それに、>322 は変数を内側に書くようにして、
あとは ! の有無で切り替えようと言ってるわけで、
真偽を逆にするたびに ! の有無が変わるだけだ。
341デフォルトの名無しさん:2005/12/27(火) 15:09:24
>>340
線形代数の単位取り直して来い。
342デフォルトの名無しさん:2005/12/27(火) 15:30:13
大学中退で線形代数なんてやってないけどおk?
行列もやってないし、どうすればいいの・・・。
343デフォルトの名無しさん:2005/12/27(火) 15:34:49
数学なんていらないだろ
小卒の俺が言うんだから間違いない
と信じたい
344デフォルトの名無しさん:2005/12/27(火) 15:37:38
>>343
義務教育を受けてください
345306:2005/12/27(火) 15:39:53
気合いと知恵があればMatrix likeに流れるdataを見て、こいつはいい女だとかも言えるのか...ありがとうございました。
346デフォルトの名無しさん:2005/12/27(火) 16:56:23
>>341
じゃあ多次元での大小関係って何よ?
347デフォルトの名無しさん:2005/12/27(火) 17:59:24



おまいら、なに難しい話してんだ?
わかりやすく言ってくれよ。





348デフォルトの名無しさん:2005/12/27(火) 18:03:43
二次元での縦スジはとても良いものである
では二次元以外の多次元ではどうなのか

こんなところ
349デフォルトの名無しさん:2005/12/27(火) 18:57:00
>>316
<ios646.h>にはandがあるんだな。
350デフォルトの名無しさん:2005/12/27(火) 19:00:21
>>349
and と AND はCでは違うくね?
351デフォルトの名無しさん:2005/12/27(火) 19:27:04
C++ だと and と or があるね。
352だれもわからなかった:2005/12/27(火) 21:01:23
main.cからDelayMs(250)を呼び出すのですが(250なら0.25秒遅らせる。)
この関数の中身の意味がわかりません。
どなたか細かく流れをおしえていただけないでしょうか。(#define以外わからない)
↓delay.cのソース
#ifndefXTAL_FREQ
#defineXTAL_FREQ 4MHZ/* Crystal frequency in MHz */
#endif

#defineMHZ*1000L//なぜアスタリスク?/* number of kHz in a MHz */
#defineKHZ*1/* number of kHz in a kHz */

#ifXTAL_FREQ >= 12MHZ //ifってなに?

#defineDelayUs(x){ unsigned char _dcnt; \   //\ってなに?改行?
_dcnt = (x)*((XTAL_FREQ)/(12MHZ)); \
while(--_dcnt != 0) \
continue; }
#else  //不明

#defineDelayUs(x){ unsigned char _dcnt; \
_dcnt = (x)/((12MHZ)/(XTAL_FREQ))|1; \
while(--_dcnt != 0) \
continue; }
#endif

extern void DelayMs(unsigned char);
353デフォルトの名無しさん:2005/12/27(火) 21:04:34
(--;
354デフォルトの名無しさん:2005/12/27(火) 21:05:36
>>352
入門書買って勉強してから来い。
そんなレベルの質問を毎回する心算か?
355だれもわからなかった:2005/12/27(火) 21:10:23
 いや そんなつもりは・・・
そんなレベル!??まじっすか??これって簡単なの!?

356デフォルトの名無しさん:2005/12/27(火) 21:14:00
算数で言えば「+って何?」程度の質問。
357デフォルトの名無しさん:2005/12/27(火) 21:21:41
>>352
> #ifndef XTAL_FREQ
> #define XTAL_FREQ 4MHZ/* Crystal frequency in MHz */
> #endif
XTAL_FREQがまだ定義されていなければ(#ifndef)XTAL_FREQを4MHZと定義する。
#ifとか#ifndefは#endifで閉じる。

> #define MHZ *1000L//なぜアスタリスク?/* number of kHz in a MHz */
> #define KHZ *1/* number of kHz in a kHz */
その*は×(乗算)。100MHZと書くと100*1000Lと置き換えられる。

> #if XTAL_FREQ >= 12MHZ //ifってなに?
#ifは「もし〜だったら」。中学英語。

> #defineDelayUs(x){ unsigned char _dcnt; \   //\ってなに?改行?
> _dcnt = (x)*((XTAL_FREQ)/(12MHZ)); \
> while(--_dcnt != 0) \
> continue; }
\はマクロを複数行に分けて書きたいときに使う。

> #else  //不明
この#elseは(上の)#ifとセット。elseが分からないとは言わせない。

そのくらいか?
358デフォルトの名無しさん:2005/12/27(火) 21:22:35
>>352
ついでに言うとスレ違いだから
359だれもわからなかった:2005/12/27(火) 21:51:24
>>357 いや本当にかたじけない。でも説明してもらうとわかった気になる。
解説ありがとう。
MHZ *1000Lっていう定義は初めて知りました。MHZ 100なら知っていたのですが・・
12MHZみたいな書き方がゆるされるとは・・・


>>358すまん
360デフォルトの名無しさん:2005/12/27(火) 21:59:11

#include <stdio.h>

/* トークンペースト */
#define _TPA(X) L ## X
typedef wchar_t TCHAR ;

int main (void)
{
TCHAR szFormat[] = _TPA ("天皇陛下万歳: %d byte\n") ;

wprintf (szFormat, sizeof szFormat) ;

return 0 ;
}
上の例で「天皇陛下万歳」を抜き取ると表示されるけれども日本語を一言でも入れると表示されないのはなぜでしょうか。
361デフォルトの名無しさん:2005/12/27(火) 22:17:40
setlocale() < locale.h > を使ったら解決しました。
なぜこんなことが必要なのか MSDN をみてもよくわかりませんでしたが。
362デフォルトの名無しさん:2005/12/27(火) 22:50:33
>>360
wprintfなどCライブラリのワイド文字入出力の入出力時には全てマルチバイト文字へ変換している。
だからsetlocaleなどで日本語(Shift-JIS)を使うと明示してやらないといけない。
363だれもわからなかった:2005/12/27(火) 23:03:47
先ほど上でソースの説明を受けたものですがもう一度だけお願いします

void DelayMs(unsigned char cnt)で引数を受けとる。例えば引数が250なら
DelayMs(250)となる。

#if XTAL_FREQ <= 2MHZ
do {
DelayUs(996);
} while(--cnt);
#endif
これはXTAL_FREQが4MHZと定義されているので4MHZ<=2MHZとなる。
#ifなのでこの条件を満たしているときdo while文を実行する。今回は満たしていないので実行しない
(XTALを4MHZと定義しておきながらなぜこんな意味のないdo while文が?)

#if XTAL_FREQ > 2MHZ
unsigned chari;
do {
i = 4;
do {
DelayUs(250);//ここらの解釈がまちがっているのだろうか?
} while(--i);
} while(--cnt);
#endif
//4MHZ>2MHZだから上を実行する。cntに250が入っているとすると--250で1づつ減らす(do whileを250回実行する?しかし中のdo whileはi=4で4回しか実行できない?DelayUs(250)関数の中身をみると
_dcnt = (x)/((12MHZ)/(XTAL_FREQ))|1; \while(--_dcnt != 0) \continue; }なので(x)に250を渡し
て250/3になるので83.33になる。??あと/(XTAL_FREQ))|1;←の|1;ってバグ??このプログラムはmain.cでDelayMs(250);と呼び出せば0.25秒遅らせる関数なのですがどう考えても83.33にしかなりません。だれか詳しいアドバイスお願いいたします。


364デフォルトの名無しさん:2005/12/27(火) 23:38:19
|1 は 0 にならないようにするため。
その CPU は 83 回空ループすると 250 us になるんだろう。
この手のコードは 2 年前くらいはよく見たが、まだ使われてるのか?

頼むから入門書の一冊も読んできてくれ。
365デフォルトの名無しさん:2005/12/27(火) 23:38:57
>>363

頼みますから、C言語の常識的な部分ばかり質問しないでください。
そんな単純な話は自分で入門書でも読めば分かるでしょうに。

とだけ言うのもなんだから、

上は996us * cntのwait
下は250us * 4 * cntのwait

どちらも大体、cnt * 1000us(cnt * 1 ms)のwaitをしている。

んで、 |1 の部分はビット論理和、ループ回数を非ゼロにするためにしている

たとえば、xに0を送り込まれると、
それをしないと(そのソースだと)無限ループに陥る。

関数そのものは推測だけど、単にビジーループでwait取ってるだけ。

こんな簡単なことは質問しなくてもソース読めば分かるでしょ?
次からは自分でソース読んで理解しろよ。
366デフォルトの名無しさん:2005/12/27(火) 23:41:59
間違えた。
×2 年前
○20 年前
367デフォルトの名無しさん:2005/12/28(水) 09:04:47
>>352
単なるソフトウェアウェイト。
CPUクロックに合わせて実装を分けているだけに過ぎない。
368デフォルトの名無しさん:2005/12/28(水) 17:51:43
リスト構造ってあまり使わないのですが、2次元の表を扱うときに使うものなんでしょうか?
369デフォルトの名無しさん:2005/12/28(水) 17:54:08
連結リストの事です
370デフォルトの名無しさん:2005/12/28(水) 17:56:06
アルゴリズムの説明を見ても、例が2次元の表ばかりなので、、。
どういうときに使うと便利でしょうか?
371デフォルトの名無しさん:2005/12/28(水) 18:00:47
自己解決しました
372デフォルトの名無しさん:2005/12/28(水) 18:05:25
>>371
何が自己解決したんだ? ここはIDなし掲示板だから何が解決したのか全く分からんぞ。
373368:2005/12/28(水) 18:20:21
>>371
おぃ。漏れに成り代わって勝手に自己解決しないでくれ
374368:2005/12/28(水) 18:25:55
undu reduの処理を実現するのに使うと便利かなと考えたんですが、、
配列で事足りるものが多いし、、。
375デフォルトの名無しさん:2005/12/28(水) 18:31:55
undu?redu?
なんだそれ?
376デフォルトの名無しさん:2005/12/28(水) 18:34:34
←→
377デフォルトの名無しさん:2005/12/28(水) 18:36:25

378デフォルトの名無しさん:2005/12/28(水) 18:40:14
undo, redoも知らない池沼は黙っててよ
379デフォルトの名無しさん:2005/12/28(水) 18:41:53
>>377
IEに戻るボタンついてるやろ?あれのことやで
380デフォルトの名無しさん:2005/12/28(水) 18:51:35
なにこの流れ。
381デフォルトの名無しさん:2005/12/28(水) 18:52:05
川の流れのように。
382デフォルトの名無しさん:2005/12/28(水) 20:33:54
涙流れてどこどこ行くの
383STRTOK代用:2005/12/28(水) 22:07:52
失礼します。詳しい方には超基本的な質問なんですが、
わたしはこの度string.hのstrtokという関数の使い勝手に
問題があったので適応に必要なだけの機能を実現する
サブルーチンを作りました。それが以下です


384STRTOK代用:2005/12/28(水) 22:10:36
char *extract2(char str[]){

/***********************************************
* TABで区切られた文字列から
* 2単語目を返す。
* 入力:文字列(str)
* 出力:文字列ポインタ
*
* ヘッダ:string.h,stdio.h
***********************************************/

int i,j=0;
char out[30],*p;

while(str[j]!='\t'){/*str[]の内容がTABじゃない間j++*/
j++;
}
while(str[j]=='\t'){/*str[]の内容がTABでもj++*/
j++;
}
for(i=0;str[j]!='\0';i++,j++){/*2単語目についたのでコピー開始*/
out[i]=str[j];
}
/*出力確認用のputs。確認するとoutの尻にごみがついている*/
       puts(out);

       /*この辺の出力をどうしていいのか*/
return ;
}
385STRTOK代用:2005/12/28(水) 22:12:12

こんな感じのプログラムなのですが出力をreturnをどうしていいのか
わからずに質問させていただきました。作り始めたときのイメージは
ポインタで出力して、それを使えばいいと思ったのですが
どうもうまくいきません。

質問1、どうやったらOUTにごみがつかない様にするか。
質問2、出力の仕方はどうするか。
赤ペン先生、添削お願いします!糞単純なプログラムですいません!
386デフォルトの名無しさん:2005/12/28(水) 22:13:23
自分の受け取りたい形式で受け取ればいい。
387デフォルトの名無しさん:2005/12/28(水) 22:15:45
>>384
最後にゴミが出るのはnul文字をoutにコピーしていないから。

あとは、outは関数の引数で受け取る形にして、最後に
return out;にでもすれば良いんじゃないの。
388387:2005/12/28(水) 22:22:57
自分ならこんな感じに書くかな。
#include<stdio.h>
char *extract2(char str[],char out[]){
    *out='\0';sscanf(str,"%*[^\t]%*[\t]%s",out);
    return out;
}
int main(){
    char out[30];
    char*p=extract2("Hello\tWorld",out);
    puts(p);
}
389デフォルトの名無しさん:2005/12/28(水) 22:44:42
>>388
コピーせずにポインタだけ返したほうが良くね?

char *extract2(char*str){
    while(*str&&*str!='\t')++str;
    while(*str=='\t')++str;
    return str;
}
#include<stdio.h>
int main(){
    char*p=extract2("Hello\tWorld");
    puts(p);
}
390デフォルトの名無しさん:2005/12/29(木) 00:16:00
>>389
3単語以上あったらどうすんだ?
391デフォルトの名無しさん:2005/12/29(木) 00:50:18
GMPライブラリについて詳しく述べてあるスレはどこにあるのでしょうか?
392デフォルトの名無しさん:2005/12/29(木) 00:56:16
ここは、何のスレなんだよw
393デフォルトの名無しさん:2005/12/29(木) 01:04:32
教えてください。板の名前だけでもいいです。お願いします
394STRTOK代用:2005/12/29(木) 01:08:42
皆さんありがとうございます!
388さん389さん大変参考になりました。
ありとうございます^^
390さん、確かにそうなんですが今回は

1234 3445
1123 4545
5928 8523

みたいな内容が書いてあるファイルの右の列の
内容を取り込みたかったもので^^ではありがとうございました〜^−^
395デフォルトの名無しさん:2005/12/29(木) 01:14:56
>>391
検索かけたが該当なし。諦めろ、少なくともここではない。
396デフォルトの名無しさん:2005/12/29(木) 03:31:51
どなたかおしえてください。

EZ-USBでやろうと四苦八苦してます。

EZ-USBのサンプルソースがVBで書かれていて
どーにもよく分かりません。

C言語で書く場合
ドライバのオープンはどうやればよいのでしょうか?
API名(関数)でもいいのでどなたか教えてください。

VBではCreateFile()を使ってオープンしてました。

397デフォルトの名無しさん:2005/12/29(木) 03:33:21
あ、すいません1行ぬけました。。

USBの制御をC言語でやろうとしてます
>>EZ-USBでやろうと四苦八苦してます。
398デフォルトの名無しさん:2005/12/29(木) 03:35:54
CreateFileはAPIじゃないのかw
399デフォルトの名無しさん:2005/12/29(木) 03:38:20
CreateFileはファイルの読み書き用のAPIじゃないんですか?

CreateFileでいけるんでしょうか?。

VBではCreateFileの第一引数にUSBドライバーの名前を指定していました。
400デフォルトの名無しさん:2005/12/29(木) 03:40:55
それくらい調べろや
401デフォルトの名無しさん:2005/12/29(木) 06:06:05
402ビル・ジョブス:2005/12/29(木) 19:28:01
まずVBのサンプルソースをCにしてみれば?
VBからCreateFile()してるなら、それをそのまま使えばいいわけだし。
CreateFile()ってWIN32APIだから、VBでもCでも使えるってところ分かりますか?
文字列とか少しウザイけど、それはVBならではの問題だからCならもっとエレガントに
記述できるはず。
とりあえず、サンプルソース張ってみそ?だれかがCに変換してくれるよ。
403デフォルトの名無しさん:2005/12/29(木) 19:30:59
>>402
ここは、誰かがCに変換するスレじゃねぇよ
404デフォルトの名無しさん:2005/12/29(木) 19:45:51
>>403
コラコラ!ビル様になんて口の利き方してんだ!
そのお方は、このスレのPart1の1であるぞ。
405デフォルトの名無しさん:2005/12/29(木) 19:47:40
>>403
そうとんがってやるなって
頭悪・・・いやど低脳スレから帰ってきたばかりで
すぐには回復できないだろうに
406デフォルトの名無しさん:2005/12/29(木) 22:28:20
enum NURUPO{
aho=0,
manko,
chinko
};

enum NURUPO a;

a=5;
とかしたらコンパイラでエラーなん?

407デフォルトの名無しさん:2005/12/29(木) 22:35:32
Cで、配列を宣言するとき

int wall[2];

というところを

int afr = 2;

int wall[afr];

という風に宣言しようとしたんですが、エラーが出ます。
状況によってafrの値を変えて配列を作る時の要素の数を変えたいんですが、何かいい方法ありますか?
408デフォルトの名無しさん:2005/12/29(木) 22:40:49
>>407
malloc
409デフォルトの名無しさん:2005/12/29(木) 22:40:56
方法1、C99対応したCコンパイラを使う。
方法2.mallocで動的にメモリアロケートする。
方法3、C++ std::vectorを使う。
410デフォルトの名無しさん:2005/12/29(木) 22:41:14
>>407
それは、C99という最新の(しかしほとんど無視されている)C言語では
認められているが、C89という古い(しかし事実上未だ標準の)C言語では
認められていない。よってほとんどのコンパイラはそれを受け付けない。
解決法はmalloc()を使うこと。ただし<stdlib.h>をincludeすること。
411デフォルトの名無しさん:2005/12/29(木) 22:45:37
>>408
>>409
>>410
迅速な回答ありがとうございます。さっそく調べて試してみます。m(_ _)m
412デフォルトの名無しさん:2005/12/29(木) 22:48:38
>>406
やってみたらいいじゃん
413デフォルトの名無しさん:2005/12/29(木) 22:50:13
>>411
freeするの忘れないようにね(・∀・)
414デフォルトの名無しさん:2005/12/29(木) 22:59:29
>>413
malloc()だけ調べていたら見落とすところでした。ありがとうございます。
参考書のポインタのところもっかい見直さないと(^ ^;)
415デフォルトの名無しさん:2005/12/29(木) 23:20:47
ポインタを引数とする関数で、引数のポインタに別のポインタを代入して
その上位の関数で利用したいのですが、セグメンテーションフォールトになります。
何か良い方法はないでしょうか?

以下はプログラムの概要です。
関数hogeはreturnを使用しない方向でお願いします。

int *foo;

void hoge (int * fuga)
{
fuga = foo;
}

int main()
{
int *fuga;
foo = (int *)malloc(int);
*foo = 1;

hoge (fuga);
printf("fuga=%d\n",fuga);
}
416デフォルトの名無しさん:2005/12/29(木) 23:23:26
>>415
ポインタのポインタを使おう。

int *foo; 

void hoge (int ** fuga) 

*fuga = foo; 


int main() 

int *fuga; 
foo = (int *)malloc(sizeof(int)); 
*foo = 1; 
hoge (&fuga); 
printf("fuga=%d\n",*fuga); 
417デフォルトの名無しさん:2005/12/29(木) 23:24:58
へんなプログラムだね。
418デフォルトの名無しさん:2005/12/29(木) 23:44:20
>>416
即レス、ありがとうございます
プログラムがうまく動作しました。
419デフォルトの名無しさん:2005/12/29(木) 23:59:57
>>417
C 自体のスキルはともかく質問は上手だ

自分が書いてるコードそのものをこんなとこに晒すような大ボケをかまさず
これ以上ないってレベルまで問題を抽出・単純化してるだろ

おまえさん、何で返却値を void に拘ってるのかも察してやれなかったんか?
420デフォルトの名無しさん:2005/12/30(金) 00:05:56
>>414
環境によってはalloca()という関数が用意されている場合もある
421デフォルトの名無しさん:2005/12/30(金) 00:16:55
>419
>返却値を void に拘ってる
の理由が解らない。
422デフォルトの名無しさん:2005/12/30(金) 00:24:24
returnしない方向だからか?
423デフォルトの名無しさん:2005/12/30(金) 00:35:41
>自分が書いてるコードそのものをこんなとこに晒すような大ボケをかまさず
>これ以上ないってレベルまで問題を抽出・単純化してるだろ

だとしても滅茶苦茶な糞コードだよ。これは。
424デフォルトの名無しさん:2005/12/30(金) 00:44:09
>>402さん
どうもです
すれ違い 誘導 されたのでそっちで聞いてみます。
425デフォルトの名無しさん:2005/12/30(金) 01:01:50
質問です。
環境は
BYTE = 2byte
char = 1byte
です。

struct A
{
char i[2];
char o[1];
};
--
printf("%d", sizeof(struct A) )で、3と表示されました

struct B
{
short i;
char o[1];
};
--
printf("%d", sizeof(struct B) )で、4と表示されました。

何ででしょうか?
構造体の中の、一番でかい型で、切られてくんでしょうか?
426デフォルトの名無しさん:2005/12/30(金) 01:06:50
VIPの日付が小数点ついたのは
正月用だよな?
427デフォルトの名無しさん:2005/12/30(金) 01:08:31
428デフォルトの名無しさん:2005/12/30(金) 01:16:11
>>407
mallocなんて使うのやめといたほうがイイヨ。
リスクもコストも高いし、可読性悪いよ。
素直に代入しなよ。
漏れは、a[2] = {x,y};派だけど。
429デフォルトの名無しさん:2005/12/30(金) 01:17:48

int a[afr]か。。すまそ。
読解力なさを露呈しました。
430デフォルトの名無しさん:2005/12/30(金) 01:18:24
代入?
431407:2005/12/30(金) 01:43:04
>>420
 環境が限られているとか書かれていたのでちょっと怖いです。

>>428
 ドンマイ^^
432デフォルトの名無しさん:2005/12/30(金) 01:48:43
あほすぎ
433デフォルトの名無しさん:2005/12/30(金) 10:21:07
双方向リストの仕組みがわからね・・
434デフォルトの名無しさん:2005/12/30(金) 10:21:54
あっそ
435デフォルトの名無しさん:2005/12/30(金) 14:59:09
>>433
〇→●
●←〇

分かったか?
以上。
436デフォルトの名無しさん:2005/12/30(金) 15:16:31
>>427
すぺしゃるさんくす
437デフォルトの名無しさん:2005/12/30(金) 15:23:24
printfで出力するときに、同じ行に上書きするみたいに出力するのってどうやるの?
438デフォルトの名無しさん:2005/12/30(金) 15:35:50
>>437
\r
439デフォルトの名無しさん:2005/12/30(金) 15:44:32
>>438
サンクス
440デフォルトの名無しさん:2005/12/30(金) 16:07:43
>>435
○→●→◎→▲
  ←  ←  ←

こうじゃないか?
441デフォルトの名無しさん:2005/12/30(金) 16:26:34
data data data
next -> next -> next
prev <- prev <- prev
442デフォルトの名無しさん:2005/12/30(金) 16:27:40
data    data    data
next->  next->  next
prev  <-prev  <-prev
443433:2005/12/30(金) 16:37:41
C入門書の構造体のとこに載ってた
データ入力→メモリ確保→作業用構造体にデータ挿入→チェインにぶっつなげる
の繰り返しか
444デフォルトの名無しさん:2005/12/30(金) 21:19:44
オナニーはメモ帳にでも書いてください
445デフォルトの名無しさん:2005/12/31(土) 14:46:21
おしえてくらはい。ループの最後でcontinue;する意味ってなんでしょか?
446デフォルトの名無しさん:2005/12/31(土) 14:51:43
for文の最後のほうで条件分岐の中にcontinueが入っているなら、カウントアップさせないとか。
って言うか状況分からなさ杉。
447デフォルトの名無しさん:2005/12/31(土) 15:18:32
>>446
状況はループ中の最後の1文でただcontinue;と書いてあるだけっす。
どんな意味があるのかわからんとです。そこに到達すれば自動的に
先頭に戻るのになぜ??って感じです。
448デフォルトの名無しさん:2005/12/31(土) 15:34:00
カウントアップさせないとか
449デフォルトの名無しさん:2005/12/31(土) 15:38:45
for(i=0;i<5;i++){
  適当な処理
  continue;
}
こんな感じですよ?俺には意味がわかりませぬ。。。
450デフォルトの名無しさん:2005/12/31(土) 15:42:26
>>448
すまんが、何を言いたいのか理解できない?
君の言いたいことの動作をする最小のソースコードを教えてくれ。
continueのあるなしじゃ動作は代わらんとおもう。

>>449
その場合ならcontinueのある無しでは何も動作が変わらない。
たぶん、書いた人の趣味かと。
気にせず無視で構わないと思う。
451デフォルトの名無しさん:2005/12/31(土) 15:43:22
全部に有るなら、この閉じ括弧が、分岐じゃなくてループだと明示的に表記してるだけじゃね
452魚チョコ:2005/12/31(土) 15:45:09
「俺は fortranner だ!」と伝えたかったんだよきっと
453デフォルトの名無しさん:2005/12/31(土) 15:45:51
>>450
それ聞いて安心しました。
>>451
ハイセンスなコーディング規約っすね('A`)
454魚チョコ:2005/12/31(土) 15:53:53
「ハイセンスなコーディング規約」

コメントをつけることならよくあるな

     } // end sw
    } // end for
   } // end if
  } // end while
 } // end if
} // end function

このときどうーしても switch を sw に略してしまう……
455デフォルトの名無しさん:2005/12/31(土) 18:04:44
#include < stdio.h >

typedef struct TINKO
{
    int dopyu
};

int main( void )
{
    TINKO binbin;
    binbin.dopyu = 1;
    return 0;
}

manko.c(6) : warning C4091: 空白の宣言が見つかりました。
という警告が出てしまいます。
なぜですか?
456デフォルトの名無しさん:2005/12/31(土) 18:08:30
>>455
typedef struct TINKO
{
 int dopyu
} TINKO; ←これが抜けてる
457デフォルトの名無しさん:2005/12/31(土) 18:09:04
ありがとうございました
458デフォルトの名無しさん:2005/12/31(土) 18:30:22
いや、5行目にセミコロンがない所為だから。
459デフォルトの名無しさん:2005/12/31(土) 19:19:01
>>449
私も経験があるが、ソースって結構コピペしながら作るだろ?
そんで時々コピペに失敗して実害無いからテストで見逃してしまうんだよ。

カウンターアップを・・とか言っている香具師っていったい・・。
460デフォルトの名無しさん:2005/12/31(土) 21:37:17
>>449
もしかして、出力されるコードに違いが出てるのかな?
試しに continue ありとなしのオブジェを逆汗してみるとか
461デフォルトの名無しさん:2006/01/01(日) 09:27:37
まともなコンパイラなら変わらないだろ。
462デフォルトの名無しさん:2006/01/01(日) 09:31:36
この期に及んでも試さずにそーゆーこと言うやつきらい
463デフォルトの名無しさん:2006/01/01(日) 09:51:11
元日からコンパイラなんて動かしてたら一年中動かす羽目になりそうでやだ。
464デフォルトの名無しさん:2006/01/01(日) 10:19:02
手続き型プログラミングのフローチャートとPADだったら、どちらが使い良いでしょうか?
465デフォルトの名無しさん:2006/01/01(日) 10:41:02
>>464
それは主観なんで何とでも言えちゃうね

フローチャートは俺の世代では誰にでも通じる共通語
PAD は俺んとこでは採用してないんで今使えって言われたらたぶん「使いづらい」
466黒猫は工業高校生:2006/01/01(日) 11:59:53 BE:63443232-
>>464
私はフローチャートのほうが使い良いと思う
フローチャートしか使わないからなぁ・・・
467464:2006/01/01(日) 12:14:58
>>465
>>466
そうですか。平成18年は必ず良い年になりますので。
今年も宜しくです。有難うございました。
468黒猫は工業高校生:2006/01/01(日) 12:19:35 BE:211476454-
>>467
いえいえ、こちらこそ 
469デフォルトの名無しさん:2006/01/01(日) 13:19:12
新年早々笑わせてくれるね。
for文中のcontinueでループカウンタがカウントアップされなくなったらそれこそ一大事だよ。
470デフォルトの名無しさん:2006/01/01(日) 18:02:12
redo したけりゃ goto しかないってのが、C の辛いところだな。
471デフォルトの名無しさん:2006/01/01(日) 19:09:50
そうでもない、設計しだいだといっておくよ。
472デフォルトの名無しさん:2006/01/01(日) 19:28:08
>>471
場合によっては goto 使わないと非常に見辛いものになる。
try catch があればもっと素直に書けるのに、と過去に何度思ったことか。
473デフォルトの名無しさん:2006/01/01(日) 20:12:29
足らぬ足らぬは工夫が足らぬ
474デフォルトの名無しさん:2006/01/01(日) 21:10:43
goto 毛嫌い頭が足らぬ
475デフォルトの名無しさん:2006/01/01(日) 21:39:16
>>474
御意

break は使うやつとかな
476魚チョコ:2006/01/01(日) 22:02:34
BASIC厨からCに踏み出した直後のこと。gotoレスがあまりに辛かったので、ちょいとプログラムを組み、行番号ラベルをずらりと並べたファイルを作った。

main()
{
  int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;
o100: printf("Hell of world ! ");
o110: goto o100;
o120:
:
}

先頭が数字じゃだめなので何を先頭にするかちょっと悩んだ記憶がある。
で……やりすぎて当時の貧弱なコンパイラの制限にひっかかり、計画をだいぶ縮小して実現、しかしラベルをつけていい行とだめな行の区別がつかなくて苦しかったねえ。
結局Cのいい勉強になったようん。
477デフォルトの名無しさん:2006/01/01(日) 23:51:22
それはさすがにひどい
478名無し et al.:2006/01/02(月) 00:35:53
 はじめまして。はじめて書き込みさせていただきます。
研究室のプロジェクトでCを使った解析を行っています。OSはDevian Linux (型番は忘れました0
非常に複雑な計算をするため、いくつも再帰ループを使い(そのうち多くはIF文です)syntadxエラーも
でないで、コンパイル (gcc -lm) には成功しました。また、セグメンテーションエラーもでていないことからメモリ
ーにまつわる問題もクリアしたと思います。

 ただ、計算の途中で"Terminated"というメッセージが出てきて、計算が途中で止まってしまいます。
自分では計算時間が長いため(一時間以上、もっと)アイドル時間が過ぎてしまってエラーが出ると考
えているのですが、他に何かお心当たりのある方いらっしゃいませんでしょうか。
どういう風な原因でエラーメッセージが出るのかというのが一点と、どうすれば回避できるのか(出来
れば)お聞きしたいと思っています。

 以上、よろしくお願いします。
479デフォルトの名無しさん:2006/01/02(月) 00:42:14
>>478
Devian ってことは stable が存在しない OS だよな
Segmentation Fault は、C の規約の中では undefined behavior に含まれる動作であり、そもそも出る保証すらないんで
出ないという観測事実は、異常がないという結論の根拠とできない

何か、口調からしていきなりシステムテストを始めて通らないからってパニクってるご様子だが
単体テストをしっかりやって、「ここまでは少なくともマトモだったはず」という足場をかためる方針でないと
おもちゃの域を出たコードは、断言するけど「絶対に書けない」ぞ
480デフォルトの名無しさん:2006/01/02(月) 00:59:05
>>478
単に端末が落ちてるって話かな? それなら定期的にEnterキーでも叩くか
バックグランドでechoをsleep挟んでループさせるとかしてみたらどうだろ。
スタックオーバフローならそういうメッセージが出ると思うけど、それなら再帰回数を極端に減らせば発生しないはず。
システムごと落っこちているような書き方じゃないから違うと思うけど、そうならプログラムの問題じゃないし。
要はまぁ、もう少し判るように書いてくれと。
#syntadxエラーってなんだとかね。
481デフォルトの名無しさん:2006/01/02(月) 01:13:14
>>478
ターミナルでulimit(もしくは limit)コマンド打ってみて、
cpu time とかメモリとかに制限がないか確かめてみれ。
その制限に引っかかってるようならそれが原因なんで、
制限設定を変えるべし(その方法に関してはスレ違いの話題)。

そうでなければ・・・よく分からん。
482名無し et al.:2006/01/02(月) 02:00:05
わざわざ書き込みありがとうございます。

 出来るだけ詳しく書いたつもりですが行き届かなかった点があると思います。
Syntadxエラーですが、syntaxエラーの間違いでした。

 システム全体は落ちていないと思います。エラーが出た後は普通に応答を受け付けるので。
皆様のお話を総合すると、応答がなかったので端末が落ちたのか、cpu time
もしくはメモリに制限があって、おかしなことになったのかどちらかの可能性が高いと思います。
今週初めに、部分分で分割して、limitコマンドを打ってみて、どのくらいの負荷だと
臨海値なのか調べたいと思います。

 ところで、"Terminated"というエラーが出た方は他にいらっしゃいますか?
さっき、Googleで調べましたが、killを使って強制終了するケースは多いのですが
強制終了させられるケースは稀だったので。

 いずれにせよ、コードをもっとシンプルにする方が先決なようですね。
では、近いうちにご連絡します。
ではでは。
483デフォルトの名無しさん:2006/01/02(月) 02:07:50
出直すならスレ違いだからUnixスレか環境依存OKスレ辺りにどうぞ。
484デフォルトの名無しさん:2006/01/02(月) 02:13:10
UNIX の問題でもなさそう
どこへ行けと誘導しがたい
485デフォルトの名無しさん:2006/01/02(月) 02:19:44
エラーメッセージの文面はC言語で規定されておりませんので、
Terminatedがどうとかそんな話題はスレ違いです
出て行ってください
486デフォルトの名無しさん:2006/01/02(月) 02:28:37
Terminated
ってことは相手サーバから切断されたんじゃないの?
487デフォルトの名無しさん:2006/01/02(月) 02:41:53
いまいち誰からの通知なのかが判らないなぁ。
%./foo
Terminated.
%
なのか?
あと、gccは、-Wall -Wpedanticくらいのオプションはつけてるんだろうか
488デフォルトの名無しさん:2006/01/02(月) 02:42:46
なんか特定のキーワードが気に入らない人が必死なようだけど
このスレなりに C の観点から論じれる部分の話をすればいいだけじゃん
それができないボンクラこそ出て行けよ
489ビル・ジョブス:2006/01/02(月) 03:14:47
>>478
この話題、おれが許す。
この問題をIsolateするには大まかに2つのアプローチがあるな。
1.再帰させないテンポラリーバージョンで正常終了するか?
  基本ロジックが生きているかの確認。
  正しく抜けてこなければ、どこかでcore吐かせてgdbしていく。

2.PCでVSなどの統合環境で実行できるか?(CYGWINから?)
  PCのCPUなら占有できるしVSもかなり賢いから。
  VS持ってなければ、VS C++ Expressは無料なので560MBのISOをDLすればよし。

きっとVSに怒られるプログラムに仕上がっていると思いますけど。
490デフォルトの名無しさん:2006/01/02(月) 06:22:39
>>486
Terminated のメッセージはそういう場合もあるが、そうでない場合もある。
491デフォルトの名無しさん:2006/01/02(月) 07:25:51
>いくつも再帰ループを使い(そのうち多くはIF文です)

ここが意味不明
492デフォルトの名無しさん:2006/01/02(月) 10:44:05
ネストが深すぎたのかな?
493リーナス:2006/01/02(月) 12:52:12
その問題は俺が許す。
494デフォルトの名無しさん:2006/01/02(月) 13:31:39
基礎の基礎に近くて申し訳ありませんが、どうもよく分かりません…
よろしければお願いしたいと思います。

typedef struct{
int x; int y; int z; }aaa;

の構造体の形をした配列bbb[64]をmain関数から別の関数に移して、
その別の関数内でいじった配列を更新したままmain関数に戻したいというのが目的です。
単純な変数をポインタとして使うまでは学習したのですが、配列が同じようにいかず困っています。

main関数内でkansuu(bbb);と宣言してvoid kansuu(bbb[])と受け取るとエラーはありませんが
やっぱりmain関数内に反映されません。
変に*やらを付けるとキャストが必要やら変換できないやらと言われます。
495494:2006/01/02(月) 13:33:40
× main関数内でkansuu(bbb);と宣言してvoid kansuu(bbb[])と受け取るとエラーはありませんが
○ main関数内でkansuu(bbb);と宣言してvoid kansuu(aaa bbb[])と受け取るとエラーはありませんが

でしたorz
496デフォルトの名無しさん:2006/01/02(月) 13:35:03
そのプログラムうp
497494:2006/01/02(月) 13:48:43
私へのレスでよろしかったでしょうか?
つまらないプログラムですがどうぞ…オセロのCPU役を作っています。
現在終局後の勝敗判定の関数だけが出来上がっている状態です。

main関数を解説しますと、
配列pointsには盤面状態(x座標,y座標,空白1黒2白3を意味する数字の3つの情報×64マス分)が入っています。
現在作っている関数changeは相手に手を入力してもらいそれによって盤面を変化させる関数です。

http://www.za.ztv.ne.jp/yosi-h/page001
498494:2006/01/02(月) 13:53:50
あれ?

>main関数内でkansuu(bbb);と宣言してvoid kansuu(bbb[])と受け取るとエラーはありませんが
>やっぱりmain関数内に反映されません。

今やったらこのままで反映されてましたwwwwwwwwwwww
何故か解決しましたorzorzorz
499ビル・ジョブス:2006/01/02(月) 13:54:29
>>494
もしかして・・構造体の配列の実体を渡すなんて止めてくれよ。
もしも、bbb[]のオリジナルを保持しておきたいなら、main()内でコピーccc[]を作っておけ。

○main関数内でkansuu(bbb);と宣言してvoid kansuu(aaa *bbb)と受け取る。
kansuu()内では、bbb[n].xでアクセスできます。
これはC言語仕様の弱点(利点)でポインタ渡しなら全て配列として解釈できる。
この場合、実際配列なので問題無いが配列でない場合[1]はメモリ破壊となる。

可読性向上とバグ防止のため、void kansuu(aaa *bbb,int numOfArray);にしましょう。
ファイルの拡張子は.cでよろしく。
これにて一件落着。
500デフォルトの名無しさん:2006/01/02(月) 13:55:51
>main関数内でkansuu(bbb);と宣言して

それは宣言ではない
501ビル・ジョブス:2006/01/02(月) 13:57:28
うッ・・遅レス。
502494:2006/01/02(月) 14:04:58
>>501
いえ、原因が分からないまま解決した形になっていたので大変ありがたいです。
確かにbbb[n].xで変更するとmain関数内の配列にも反映されていました。
参考にさせていただきます。

>>500
言い方としておかしいということでしょうか?
半年ROMりますorz
503デフォルトの名無しさん:2006/01/02(月) 14:07:34
呼び出し
504デフォルトの名無しさん:2006/01/02(月) 14:07:56
>もしかして・・構造体の配列の実体を渡すなんて止めてくれよ。

場合によるね
何が起きるのかを理解した上で処理方式を選択することこそ C の特徴を活かせる考え方で
わけもわからず毛嫌いして表現力を落とすのはただのアフォだ


>>494
あなたの話をまとめるとこうか?
typedef struct { int x, y, z; } aaa;
main() {
aaa bbb[64];
kansuu(bbb);
}
void kansuu(aaa bbb[]) { }

これが通るコンパイラは規格合致処理系ではないから
そこで通用したことを標準とは思い込まない方がいいぞ

方言のあるコンパイラを毛嫌いせよと言うつもりは毛頭ないが
505デフォルトの名無しさん:2006/01/02(月) 14:19:15
voidを問題にしてるの?
506デフォルトの名無しさん:2006/01/02(月) 14:20:21
違う
507494:2006/01/02(月) 14:23:03
>>503
なるほど、その方が確かにしっくりいく感じですね。
ありがとうございます。

>>504
>これが通るコンパイラは規格合致処理系ではないから

そうなのか…orz
家ではvisual Cで、大学ではGCC(?)でやっています。
とりあえずまた詰まってどうしようもなくなるまで頑張ります。
508デフォルトの名無しさん:2006/01/02(月) 14:26:26
>>494 == >>507
それより >>489 >>504 の言っていることはどうでもいいので
scanf使ってる事の方を改めるべき
反映されたりされなかったりするのは
x y が 0 になっているから
509デフォルトの名無しさん:2006/01/02(月) 14:36:41
電波キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
510デフォルトの名無しさん:2006/01/02(月) 16:27:11
外部変数にすりゃいいんじゃないの
511デフォルトの名無しさん:2006/01/02(月) 17:56:30
複数のメンバを持つ構造体の初期化で「={0};」ってのを見ることがあるんですが、
これって先頭以外のメンバも 0 になるんですか?

struct test{
 int a;
 int b;
};

void f()
{
 test t={0};

 // t.b も 0 になることは保証されてる?

}
512デフォルトの名無しさん:2006/01/02(月) 18:00:33
>>511
省略した分は0初期化が保証されています
513デフォルトの名無しさん:2006/01/02(月) 18:05:05
>>511
あなたは正常な神経の持ち主
本筋として 0 保証が欲しければ 0 と書けばいいんだけどね
C は他にもいくつか順当な類推を裏切る仕様があるから
規格票をすぐチェックできるようにしとくが吉
514デフォルトの名無しさん:2006/01/02(月) 18:30:47
ここの人たちって、プログラムを作る際に
内部とレース関数みたいなものを自作してますか?

今度、仕事で作ろうと思っています。
何か参考となるものがありますでしょうか?

ちなみにCでメカ制御などの組み込み系をやっております。
515デフォルトの名無しさん:2006/01/02(月) 18:31:23
>内部とレース関数みたいなものを自作してますか?

内部トレースのスペルミスでした・・・すみません
516デフォルトの名無しさん:2006/01/02(月) 18:39:52
>>514
#define a(b) fprintf(stderr, "%s(%d):%s==%x\n", __FILE__, __LINE__, #b, (unsigned)(b), getchar())
みたいのか?

組み込みだとハード設計でも diagnostic どうするか考えるべ?
517デフォルトの名無しさん:2006/01/02(月) 19:46:35
組み込み系のスレに行った方がいいかと
518デフォルトの名無しさん:2006/01/02(月) 19:52:42
>>517
アフォ
組み込みでもデバッグに fprint(stderr はビシバシ使うんだよ
もちろんコンソールの存在しないターゲットでね
519デフォルトの名無しさん:2006/01/02(月) 19:53:00
f
520デフォルトの名無しさん:2006/01/02(月) 20:02:12
printfとかくと面倒なので
printで済ます人も多い
521デフォルトの名無しさん:2006/01/02(月) 20:20:01
本当につまらない質問なのですが、今、
「2つの数を足す関数を宣言し、この関数を利用してプログラムを作成せよ」
という問題を解いています。

・・・誰かプログラムを組んでくださいorz
その解読は自力でノートと教科書を読んで頑張ります
戻り値とか引数とかをどう使えばいいのか見当も付かないんですorz
522デフォルトの名無しさん:2006/01/02(月) 20:21:19
523デフォルトの名無しさん:2006/01/02(月) 20:27:10
>>521
同情の余地がかけらもねえな
必須科目なら留年か退学しろ
524デフォルトの名無しさん:2006/01/02(月) 20:31:01
おk、あきらめて素直に留年するorz
525デフォルトの名無しさん:2006/01/02(月) 20:39:06
>>521
2つの数を足す関数作ったよ
さらにこの関数を利用したプログラムはこちら


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

void tasu( int a, int b )
{
  int c;
  c = a+b;
}

int main( int argc, char*: argv )
{
  int a,b;
  
  if( argc<3 ){
    printf("usage: %s <number> <number>\n",argv[0] );
    exit(0);
  }

  a = atoi(argv[1]);
  b = atoi(argv[2]);
  tasu( a, b );

  return 0;
}
526デフォルトの名無しさん:2006/01/02(月) 20:49:23
>>524
どうする?
来年も同じ科目が再履で待ってるだけだぞ
527デフォルトの名無しさん:2006/01/02(月) 20:49:40
スレ違いに答えんなや!
528デフォルトの名無しさん:2006/01/02(月) 20:52:36
>>527
この答なら大丈夫だよ
529デフォルトの名無しさん:2006/01/02(月) 21:02:31
>>525
味わい深い。
530デフォルトの名無しさん:2006/01/02(月) 21:06:43
>>525
ありがとうございます!!
今から解読します。

>>526
2回目聞いたら分かるでしょう、たぶん。
531デフォルトの名無しさん:2006/01/02(月) 21:11:47
>>530
解読はおすすめしない
そのまま提出しる
532デフォルトの名無しさん:2006/01/02(月) 21:12:52
そうなのですか?
ってか、これはレポートで、説明しないといけないので解読しないと・・・。
533デフォルトの名無しさん:2006/01/02(月) 21:14:17
腐った職場の縮図だな
534デフォルトの名無しさん:2006/01/02(月) 21:20:14
>>532
かわいそうだからマジレスするが、tasu()に渡した値がどうなってるか見てみろ
535デフォルトの名無しさん:2006/01/02(月) 21:35:53
>>534
なにかおかしいとこある?

・ ・ ・ ・
仕様通りじゃね?
536デフォルトの名無しさん:2006/01/02(月) 21:40:45
仕様上は「宣言して利用せよ」であって、このプログラム内で定義せよとは書いてないから
プロトタイプ宣言だけでっちあげればよさげ。
537デフォルトの名無しさん:2006/01/02(月) 21:47:51
>>535
確かに「2数を足す関数」という仕様通りだな
538デフォルトの名無しさん:2006/01/02(月) 22:21:25
昨日から読み始めたんだが、やっとhello!worldが出せるようになった。
皆の話してることがまだよくわからない
539デフォルトの名無しさん:2006/01/02(月) 22:22:22
>>538
ここに来る前に、本でも買って読め。
540デフォルトの名無しさん:2006/01/02(月) 22:24:32
もう読んでるけど、意味がわからんので逐一わからん用語をネット検索してるよ。
今は本よりネットだ
541デフォルトの名無しさん:2006/01/02(月) 22:31:30
>>539
冬厨がぶしつけな質問叩きつけてるわけじゃないんだから拒絶せんでも…
スレ的に忙しいわけでもないし。
542デフォルトの名無しさん:2006/01/02(月) 22:32:49
じゃ、漏れもここに日記書くお。
543デフォルトの名無しさん:2006/01/02(月) 22:33:56
>>540
ネット検索で勉強はダメ

すでに十分習得した人が、新しい知識をネットで調べるのはいいが
初心者がネットで言語を勉強するのはやめたほうがいい
断片的なつぎはぎだらけの知識の習得で終わってしまう

本をよめ!
544デフォルトの名無しさん:2006/01/02(月) 22:34:20
処理が生かされてない・・・
545538:2006/01/02(月) 22:39:02
本読んでも、俺の頭が悪いのか、本の選択ミスなのか、、、
本には実行例で書いてあるが、どうやってコンパイルするのかも書いてなくて
調べてた。
546植松のパクリ(1):2006/01/02(月) 22:40:27
植松のパクリ(1)
作曲:タルレガ 曲名:ラグリマ
http://www2.arnes.si/~msterg/Midi/Tarrega/Tarrega_Lagrima.mid

作曲:植松伸夫 曲名:山の向こうに
http://www.ffplanet.com/ff7/musiche/07-Other_Side_of_Mountain.mid
547デフォルトの名無しさん:2006/01/02(月) 22:43:12
>>545
どうやってコンパイルするかは千差万別だからまともな本・純粋に言語のことを書いた本には書いていなくて当然。
548デフォルトの名無しさん:2006/01/02(月) 22:55:49
>>545
ハハハ
言語の本とコンパイラの本は別ものだよ。
つまりC言語の本とコンパイラの本(VCとかgcctとか)の本の2冊は必要。
549デフォルトの名無しさん:2006/01/02(月) 23:01:35
コンパイル云々に関してはそれこそねとだけでいけるだろ
550538:2006/01/02(月) 23:26:01
そうなんだ、、何も知らなくてさ。
例えば
#include <stdio.h>

main()
{
printf("hello\nworld.\n");

}
と書いてあるので、実行してみるとエラーがでるんだよ
何がおかしいの?
551デフォルトの名無しさん:2006/01/02(月) 23:28:36
552俺からのお年玉だ:2006/01/02(月) 23:32:11
>>550
main関数が返す値は?
553俺からのお年玉だ:2006/01/02(月) 23:32:45
あ、それ以前に関数にもなってないなw
554538:2006/01/02(月) 23:34:05
書いてなんんだけど、、
もしかしてreturn?
555デフォルトの名無しさん:2006/01/02(月) 23:34:31
以降スルーで。
556俺からのお年玉だ:2006/01/02(月) 23:34:34
>>550
本当にその通り本に書いてあるなら本の選択を間違ったなw
557デフォルトの名無しさん:2006/01/02(月) 23:39:12
>>535
なんのエラーがでるの?
これから、あなたがどうC言語とかかわっていくかはわからないけど、
エラーの報告をするのに「エラーが出ました」ではダメ。

エラーの状況を詳細に報告すること。このケースではエラーメッセージの内容。
558デフォルトの名無しさん:2006/01/02(月) 23:39:38
>>550  本が悪い。このへん参考に買いなおすことをお勧めする

http://pc8.2ch.net/test/read.cgi/tech/1133629787/
559デフォルトの名無しさん:2006/01/02(月) 23:48:39
×報告
○調べる
560デフォルトの名無しさん:2006/01/02(月) 23:48:41
関数には必ず戻値と引数が要る。

>>550の例で言うなら、main()の部分が一番の問題。
main は関数の名前でしかない。
関数の名前の前に戻値、関数の名前の後の()の中に引数を、
指定していないから、エラーが出る。だから、

void main(void)
{
printf("hello\nworld.\n");
return;
}

とすれば出ないはず。
void main(void) の意味は、
この関数はmainという名前の関数で、
voidの値を受取り(voidは値のない値という意味なので、つまり値を受取らず)、
{ }内の処理を行って、
voidの値を返す(つまり値を変えなさい)関数です、という意味になる。
ただし、この書き方でも厳密に言うと、main関数の正しい宣言ではない。
ちゃんとした知識を得るためにちゃんとした本で勉強することをオススメする。
561デフォルトの名無しさん:2006/01/02(月) 23:52:44
mainはintだろボケ
562デフォルトの名無しさん:2006/01/02(月) 23:57:01
>>561 条件反射なレスは良くないと思うのココロ
563538:2006/01/03(火) 00:01:28
悪いな初心者な質問で。
>>560ありがとう。
実行したらできたよ。
もうちょっと解るようになって苦しんだら来る。
ノシ
564538:2006/01/03(火) 00:03:19
>>558
いい忘れ
そうだな、ここを参考して新しい本買ってくる。コンパイラ本と一緒に。
565デフォルトの名無しさん:2006/01/03(火) 00:03:52
わざわざvoid mainを例に出す意味が理解できません。
566560:2006/01/03(火) 00:13:10
>>565
intの型の説明がメンドくさかった。
それともreturnの意味も説明した方が良かったか?
あとはちゃんとした本を読んで自習させた方がいいだろう。

>>521も他人の答えを鵜呑みにしないで、ちゃんと自分で考えろよ。
567デフォルトの名無しさん:2006/01/03(火) 00:17:42
>>566
俺なら>525でひねくれてマクロ関数にしてやってたと思う。
逐一しっかり答えてやってるお前はすごいと思うよ。
568デフォルトの名無しさん:2006/01/03(火) 00:20:21
>>566
面倒で嘘教えるなら最初から一切説明するな
嘘を教えるのは最低の行為だ
569デフォルトの名無しさん:2006/01/03(火) 00:22:23
>>568
学校でも日常的に嘘教えてるだろ。
真実を教えて無駄に混乱させる必要は無いと思うがな。
570デフォルトの名無しさん:2006/01/03(火) 00:23:25
>ただし、この書き方でも厳密に言うと、main関数の正しい宣言ではない。
>ちゃんとした知識を得るためにちゃんとした本で勉強することをオススメする。
571デフォルトの名無しさん:2006/01/03(火) 00:23:43
少なくともmainの返値については
「初歩の時点で理解を助けるからvoidにしておく」ってのはいい姿勢とは思えないな。
572デフォルトの名無しさん:2006/01/03(火) 00:25:32
>>569
学校で嘘おしえてるからどうだってんだ?氏ねよ
573デフォルトの名無しさん:2006/01/03(火) 00:25:33
>>568
まあまあ
574デフォルトの名無しさん:2006/01/03(火) 00:27:45
つーかさ、ちゃんとした本ってなに?
K&Rでもmain(){ }でreturnもexitもなかったよ
575デフォルトの名無しさん:2006/01/03(火) 00:29:09
>>572
いちいち興奮すんなって・・・・

>>574
K&Rは初心者が読むもんじゃないだろ。
ある程度理解したやつが更に深く知るために読むもんだと思ってるんだが。
576デフォルトの名無しさん:2006/01/03(火) 00:31:51
>>574
いつのK&Rかな?
Ansi-CのC解説書が一番いいと思うよ
577デフォルトの名無しさん:2006/01/03(火) 00:32:40
main() ってint main()の事じゃないの?省略してるだけで。
void main()の話とはまったく違うと思うが。
578デフォルトの名無しさん:2006/01/03(火) 00:42:50
いまどきANSI-CではないCなんか教えたって意味ないだろ。
579デフォルトの名無しさん:2006/01/03(火) 00:45:24
なんでintではなくvoidではだめなのか
初心者にも分かりやすく説明してください
580デフォルトの名無しさん:2006/01/03(火) 00:45:57
C言語抜けた処理系が気づかないから?
581デフォルトの名無しさん:2006/01/03(火) 00:48:10
処理系?が気付かない?とは?
582デフォルトの名無しさん:2006/01/03(火) 00:50:08
>>579
そういう仕様だから。

に尽きるだろ。
returnでTRUE返してエラーとかはあまり最近考えないし。
583デフォルトの名無しさん:2006/01/03(火) 00:51:44
なんでintではなくvoidではだめなのにvoidでもできる仕様なのか
初心者にも分かりやすく説明してください
584デフォルトの名無しさん:2006/01/03(火) 00:51:46
最近main()書かない人が多いからね
どうでもいいよ
585魚チョコ:2006/01/03(火) 00:52:06
てゆーかさー 初心者に教えるとき困るから、ANSI にさー

「勝手に main の戻り型を int に決めるなこのやろう。
指定が省略されたら void main(void) と解釈しろこのくそぼけ。
戻り値が必要なら呼び出し側で勝手に0でも補え!! 殺すぞ!!!」

とかメールを送ろうよう。それにアレだ。コンパイラの作者もアレだ、

提案: main() の前に int と書いて、定義の最後の } の前に return 0;
とでも書いてみたらどうでしょう? いえ、いいんですけどね、用が
ないならこの提案は無視して下さい。

とかきわめて控えめかつ親切に表示してくれとか思うわ。ほんま。
586デフォルトの名無しさん:2006/01/03(火) 00:53:22
>>583
ほんとはintなんだけど(見えないところで定義されてる)
voidでも通るのは コンパイラが甘いため(警告は出してる)
587デフォルトの名無しさん:2006/01/03(火) 00:54:27
15歳以下は出場できないというきまりなんだ。
決まりにガタガタ言うな。
588デフォルトの名無しさん:2006/01/03(火) 00:55:25
動作終了したことに処理系が気づかない。
589デフォルトの名無しさん:2006/01/03(火) 00:57:05
>>585
なによ! mainはintを返さなきゃダメでしょ!
引数まで省略しちゃって、ばっかじゃないの?

わわっ、なに涙ぐんでんのよ
ほ、ほんとうはダメなんだけど、特別に許してあげるから
今日だけ-Wno-mainつけていいわよ
あ、なに笑ってるのよげんきんね!
590デフォルトの名無しさん:2006/01/03(火) 00:58:44
なにこのツンデレコンパイラ
591デフォルトの名無しさん:2006/01/03(火) 01:01:27
if [ a.out = 0 ]
then
 echo "pg is success."
else
 echo "pg isn't success."
end
こんな処理してもいいわけよ。めちゃ適当だけど(動くかどうかもわからんw)
592デフォルトの名無しさん:2006/01/03(火) 01:04:15
>>591
0返してるのにisn'tになったお(^ω^;)
593デフォルトの名無しさん:2006/01/03(火) 01:09:12
スレ違い
594デフォルトの名無しさん:2006/01/03(火) 01:11:21
研究で非常に長い入力を持つプログラムを
作っていまして、もし間違えた場合やり直しが効く
仕組みにするため以下のような構造を作って
みました。もしかしたら危険な勘違いをしてるのかも
しれないのですが、どうにも気持ち悪いのでカキコさせていただきます。


1.#include<stdio.h>
2.main(){
3.
4. char name[30];
5. char check;/*正誤チェック用文字*/
6.
7. /*名前の入力*/
8.do{
9.printf("名前を入力して下さい。\n→");
10. scanf("%s",name);
11.printf("入力内容は正しいですか?[y/n]:");
12.scanf("%s",&check);
13.printf("\n");
14.}while(check!='y');
15.}

このプログラムでは一文字のcheckを12行目で%sで取り込まないと
(%cとかだと)動きません><getcharとかもダメでした。
詳しくは文字入力が飛ばされてループの頭に戻ってしまいます?
できるんだからいいんじゃないかと思うかもしれませんが、
どうも気持ち悪い+不安は早めにつぶさないとプログラムがもっと
大規模になってから何か問題が出るのが怖いですTT
よろしくおねがいします!
595デフォルトの名無しさん:2006/01/03(火) 01:13:18
い、入れ子がなくなってるOTZ
読みにくいですがなにとぞアドバイスお願いします
596594:2006/01/03(火) 01:17:45
う、すません
テストは
windowsXP
エディタCPAD
コンパイラLSI C-86
でさせていただきました
597デフォルトの名無しさん:2006/01/03(火) 01:18:58
>>594
scanf("%s", name);で名前を入力し終わった段階で、
入力確定時に押したEnter(改行コード)がバッファに残ってしまうので
その直後のgetcharや%cでの読み込みは、その改行コードが読み込まれて終わってしまう。
"%s%*c"にするか、fgets+sscanfに書き直す(後者を推奨)
598デフォルトの名無しさん:2006/01/03(火) 01:22:05
>>594
読みにくい行番号付けるな。
599デフォルトの名無しさん:2006/01/03(火) 01:26:19
>>560
遅レスだけど、入門書から勉強し直した方がいいよ。
見てるこっちが恥ずかしくなるから。
600魚チョコ:2006/01/03(火) 01:27:39
>>594
ええっと、残念ながら scanf() を使ってる限り「安全」なプログラムにならないんだよね。

1. オーバーフロー等非対応
2. 配列の容量を超えて際限なく読み込みと同時に書き込んでメモリー内容を破壊
3. キー入力バッファーに読み残しをする。次に呼ぶとバッファーの残りを読んでそれが
指定された形式に当てはまらないとそのまま返ってきてしまう(しかもまた残す)。

で、普通は fgets() sscanf() fflush() の3つを使って読み取るんだけどそれでも変なこと
が起こるので、長くやってる人はコツコツ作りためた自前の読み取り関数をコピーしては
使ってますわねえ。
601デフォルトの名無しさん:2006/01/03(火) 01:28:02
>>597
横から質問させていただきます。

>"%s%*c"
このような書き方について解説しているサイトを教えていただけないでしょうか?
探しても全然ヒットしません
602デフォルトの名無しさん:2006/01/03(火) 01:30:07
603デフォルトの名無しさん:2006/01/03(火) 01:33:24
printf("名前は?正しけりゃ'y'打てよ");
do{
fgets(name,sizeof(name),stdin);
}while((check=getchar())!='y');
がおまいの仕様を満足させてくれるだろう
正しいですかと聞く意味がよくわからんのだが?
604デフォルトの名無しさん:2006/01/03(火) 01:35:04
>>602
即レスありがとうございます

検索が下手なばっかりに、お手数おかけしました
605デフォルトの名無しさん:2006/01/03(火) 01:37:01
fflush(stdin)は未定義だろ?
606594:2006/01/03(火) 01:50:54
>>597,>>594さま
アドバイスありがとうございます。
以前scanfは空白を含む英文みたいなものを
入力できない(できたらスマセン。近々ためします)
というのもあるので危険とかも読んだことがあります。
若干難しそうなのでスルーしていました。
そのときに用意した配列以上の入力も読み込んでしまうなども
書いてありました(独習Cかな?)
よく考えてみますが、よろしければ自作入力関数作成のヒントを
ください。fgetsということはファイルを利用するということですか?
getsのオーバーフローなどについて調べてみます
>>598
よろしければスタンダードありましたら教えてください><
>>602
ちょっと思いつきで作ったものなのですが、
実利用しているプログラムの中ではdowhileループの中に
複数の入力をしてたりしているので反射的にしたようです。
たしかに「入力内容は正しいですか?[y/n]」はちょっと
わずらわしいですねw

あり!
607デフォルトの名無しさん:2006/01/03(火) 01:53:04
>>606
fgetsの入力元をstdinにすると、標準入力、一般的にはコンソールからの入力になる。
scanf(**);とfscanf(stdin,**);は同義
608デフォルトの名無しさん:2006/01/03(火) 03:02:12
>>588
まぢでいってるの?

処理が終わったことにきづかないって・・・あふぉ?
609デフォルトの名無しさん:2006/01/03(火) 04:07:30
>>560
550 氏はエラーだと言っているのに頓珍漢なアドバイスしてんじゃねえよ
あんたの話は警告でしかない

>>600
>1.
それは sscanf でも同じこと

>2.
%d や %x はメモリー破壊を起こさない

>3.
%d や %x はトークン単位の処理で fgets + sscanf のような行単位の処理では
そのまま置き換えることはできない

>長くやってる人はコツコツ作りためた自前の読み取り関数をコピーしては
>使ってますわねえ。
コピペ厨は歴だけ無駄に長い
仕様が曖昧で単体テストもやってないからコピーと同数のパッチが頻発
scanf の中の人のほうが比較にならないぽどいい仕事をしている
610デフォルトの名無しさん:2006/01/03(火) 07:45:16
完成したC言語のプログラムを現在使用中のVisual C上だけでなく一般的なWindowsXP上で使用・再生したいのですが、
どうすればいいのでしょうか?
最悪の場合使用したいPCに今持っているVisual Cを入れたらいいのですがあんまり作業が大変です。。。
検索してもどうにもその手の情報は発見できませんでした。
よろしければご教授くださいますよう宜しくお願いします。
611610:2006/01/03(火) 07:49:51
すみません、分かりにくかったかもしれません。
例えば.exeのように、特定のアプリケーションがなくても単体で動作するような形にするのが最終的な目的です。
612デフォルトの名無しさん:2006/01/03(火) 07:53:12
>>610
Release ビルド
613デフォルトの名無しさん:2006/01/03(火) 08:19:35
割れ使ってるのか?
614デフォルトの名無しさん:2006/01/03(火) 08:54:22
>>610
それができないで一体何のためのプログラミングだと思う?
615610:2006/01/03(火) 09:20:49
すみません、遅くなりました。
Releaseビルドで調べてみたらVC内で作成可能ということが分かって色々やっていました。
ただソースコンパイルは通っているはずなのですが、どうやっても
>fatal error C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
と言われビルドが完了しませんorz
エラーメッセージ自体も検索したのですがいまいち有効な対応策が得られていない状態です。
みなさまのお知恵を拝借できればと思います。

>>613
割れではありませんが友人宅等で使用する場合に「VC入れさせて」では面倒だと思いました。

>>614
ですよねorz
616デフォルトの名無しさん:2006/01/03(火) 09:24:04
>>615
#include <stdafx.h>

あと氏ね。
617610:2006/01/03(火) 09:36:33
>>616
お前が氏ねよゴミ
618デフォルトの名無しさん:2006/01/03(火) 10:25:57
619デフォルトの名無しさん:2006/01/03(火) 11:36:36
>>617
>>616はこの板でよく使われている常套句だ。C++相談室の最初の方を
見てみろ。これを知らないという事は、お主2ch初心者だな?
620511:2006/01/03(火) 12:26:30
>>512-513
返事遅れてすみません。ありがとうございます。規格のほうも確認しておきます。
621デフォルトの名無しさん:2006/01/03(火) 14:21:11
質問なのですが、int型のn×nの2次元配列 array[n][n]を宣言して、最初は全ての要素を0で初期化し、
その後、ランダムな場所にn個の要素にだけ、1を代入したいのですが、どうすればいいのか分かりません。
たとえば、n=5だったら、
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
と初期化し、ランダムに
0 1 0 0 0
0 0 0 1 0
1 1 0 0 0
0 0 1 0 0
0 0 0 0 0
という風にn個だけ1があるという感じです。
よろしくお願いします。
622デフォルトの名無しさん:2006/01/03(火) 14:56:36
623デフォルトの名無しさん:2006/01/03(火) 16:20:45
最初から順番に1いれて、結果はランダムだと言い張ればいいんじゃね?

あと気をつけるのは配列サイズよりnのが大きいときだな。
冷たいお湯をくれと言われても困りますよ。
624デフォルトの名無しさん:2006/01/03(火) 16:24:03
C言語でバイナリファイルのバイト長はどうやって求めるの?
以下、例として単純に画像ファイルをコピーする場合。
(エラー処理は割愛)

fp1 = fopen("C:\\No_01.TIF", "rb" );
fp2 = fopen("C:\\No_02.TIF", "wb" );
fread(read_buf, 65535, 1, fp1) < 1);//MAXバイト数は65535として
fwrite(read_buf, バイト長, 1, fp2 ) < 1);

書き込む際のバイト長の求め方がどうにも分からん・・・
strlen、fgetc、feofあたりを試してみたけどダメでした。

・エディタのバイナリモードで開いて調べる
・WindowsのReadFileを使う
はなしでお願いします。
625デフォルトの名無しさん:2006/01/03(火) 16:27:06
(゚Д゚)ハァ?
626デフォルトの名無しさん:2006/01/03(火) 16:31:10
>>624
freadの戻り値。
627624:2006/01/03(火) 16:36:38
> 626
一瞬で解決しました。
ありがとうございました。
628デフォルトの名無しさん:2006/01/03(火) 17:50:45
ケツへfseekしてftellじゃだめかい?
629デフォルトの名無しさん:2006/01/03(火) 18:39:41
サイズわからねーのにいきなり読み込むのはヤバイからな。
>>628の方式でおながいします。

fseekで移動したあと元に戻すのも忘れないでください。
630デフォルトの名無しさん:2006/01/03(火) 18:45:39
長文になりますが、スマソ
正月になんで゜ρ゜)ボーっとしていたら、
不意に終了時間と開始時間を入力して、時間差を計算するプログラムを、
作りたくなって、作ったのですが、美しくありません
誰か、華麗なコードに変身させて下さい
#include<stdio.h>
intmain(void)
{
intarg_1,arg_2,arg_3,arg_4,time,min;
printf("終了時間を先に開始時間を後にスペースを空けて入力して下さい\n");
scanf("%d%d%d%d",&arg_1,&arg_2,&arg_3,&arg_4);
if(arg_1>=25||arg_3>=25)
printf("24以下の数値を入力下さい\n");
if(arg_2>=61||arg_2>=61)
printf("60以下の数値を入力して下さい\n");
if(arg_1<arg_3)
printf("開始時間と終了時間が矛盾しています\n");
if((arg_1<25&&arg_3<25)&&(arg_2<61&&arg_4<61)&&(arg_1>=arg_3&&arg_2>=arg_4)){
time=arg_1-arg_3;
min=arg_2-arg_4;
printf("時間差は\n%d時間%d分です",time,min);
}
elseif((arg_1<25&&arg_3<25)&&(arg_2<61&&arg_4<61)&&(arg_1>arg_3&&arg_2<arg_4)){
time=(arg_1-arg_3)-1;
min=(arg_2+60)-arg_4;
printf("時間差は%d時間%d分です",time,min);
}
return0;
}
631デフォルトの名無しさん:2006/01/03(火) 18:46:51
632デフォルトの名無しさん:2006/01/03(火) 18:48:37
スマソ
3行目

× intarg_1,arg_2,arg_3,arg_4,time,min;

○ int arg_1,arg_2,arg_3,arg_4,time,min;
です
633デフォルトの名無しさん:2006/01/03(火) 19:31:13
マジレスすると美しい日本語を勉強するのが先
634デフォルトの名無しさん:2006/01/03(火) 19:31:51
>>630
許されるのなら日付→UNIX時間に変換して
UNIX時間同士で引き算してUNIX時間→時分秒
635デフォルトの名無しさん:2006/01/03(火) 19:32:32
入力チェックはどこまで行っても泥臭いもの
636デフォルトの名無しさん:2006/01/03(火) 22:33:10
マインスイーパーを自分で考えながらやっているのですが、
爆弾の配置を以下の方法でやろうと思っているのですが、どうやれば良いのかわかりません。
・int型のポインタ*arrを宣言
・nを入力し、mallocでn*n分のメモリを確保
・配列の要素をすべて0で初期化
・ランダムな場所にn個だけ1を代入する
たとえば、n=5だったら、
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
と初期化し、ランダムに
0 1 0 0 0
0 0 0 1 0
1 1 0 0 0
0 0 1 0 0
0 0 0 0 0
こんな感じにしたいのですが、ランダムな場所に1を代入するところが出来ません。
よろしくお願いします。
637デフォルトの名無しさん:2006/01/03(火) 22:37:29
rand()
638636:2006/01/03(火) 22:48:07
>>637
rand関数を使えば良いということはわかるのですが、具体的にどのようにするかがわかりません。
教えていただけないでしょうか?

639デフォルトの名無しさん:2006/01/03(火) 22:54:33
>>636
0初期化するなら、初めからcallocを使ったらどうかと思う。
それはともかく、arr[0]〜arr[m * n - 1]までが配列の要素なのだから、
0〜m * n - 1の範囲で乱数を発生させれば良い。
ただし、乱数によって選ばれたところには既に爆弾が置かれていた場合を考えること。
640デフォルトの名無しさん:2006/01/03(火) 22:57:10
>>638
いくらでも方法はあるじゃん

・配列の要素を
 0 1 2 3 4
 5 6 ・・・
   ・
   ・
 20 21 22 23 24

 と考えてrand()%25

・rand()%5の二重ループにして、列,行を決定

とかね
641デフォルトの名無しさん:2006/01/03(火) 23:04:13
0-24 までの乱数を発生させる。
乱数の値が 0-4 までなら {
    arr[0*0+0]に 1 を設定する。
    0-23 までの乱数を発生させる。
    乱数の値が 0-3 までなら {
        arr[0*0+1]に 1 を設定する。
        0-22 までの乱数を発生させる。
        ・・・以下略・・・
    } else 乱数の値が 4-23 までなら {
        arr[0*0+1]に 0 を設定する。
        0-22 までの乱数を発生させる。
        ・・・以下略・・・
    }
} else 乱数の値が 5-24 までなら {
    arr[0*0+0]に 0 を設定する。
    0-23 までの乱数を発生させる。
    乱数の値が 0-4 までなら {
        arr[0*0+1]に 1 を設定する。
        0-22 までの乱数を発生させる。
        ・・・以下略・・・
    } else 乱数の値が 5-23 までなら {
        arr[0*0+1]に 0 を設定する。
        0-22 までの乱数を発生させる。
        ・・・以下略・・・
    }
}
642636:2006/01/03(火) 23:10:40
>>639-640
ありがとうございます。言っていることは分かるのですが、具体的にコードにしようと思うと難しいです。
int n,i,j;
int *arr;
n=5;
arr=(int *)malloc(sizeof(int)*n*n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
*((arr2+i)+j)=0;
}
}
この後どうすれば良いでしょうか?
643デフォルトの名無しさん:2006/01/03(火) 23:12:40
なぁ、基本くらい、本か何かで勉強してから人に聞こうぜ・・・
644636:2006/01/03(火) 23:14:18
>>643
すいません。一応ある程度は勉強しているのですが。。。
645デフォルトの名無しさん:2006/01/03(火) 23:14:51
>>642
乱数以前にそのプログラムが(ry
646デフォルトの名無しさん:2006/01/03(火) 23:18:55
rand_make(int count,int n){
 if(count==0)return ;
 int rnd=rand()%(n*n);
 while(rand_array[rnd%(n*n)]==1)rnd++;
 rand_array[rnd%(n*n)]=1;
 rand_make(count-1);
}

main(){
rand_make(n, n);
}

ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/rand.3.html
647デフォルトの名無しさん:2006/01/03(火) 23:21:37
rand_arrayは0初期化しておくことってまぁ、いらねえかw
648デフォルトの名無しさん:2006/01/03(火) 23:40:47
ていうか宿題スレいけよ
649636:2006/01/03(火) 23:44:01
>>648
宿題スレに書き込もうと思ったのですが、まちがって、ここに書き込んでしまい、そしたらレスが帰ってきたので。
宿題スレいきます。
650デフォルトの名無しさん:2006/01/04(水) 11:04:35
getch()はint型の文字コードを返すということですが

printf("%d,%d", getch(), '\n');
というプログラムで
enter押すと,13,10ってなるんですが,意味不明

'\n'はエンターキーの文字コードだと思うんですが,エロイ人教えて下さい
651デフォルトの名無しさん:2006/01/04(水) 11:33:52
>>650
それはつまり、お前のところでは'\n' == 10であり、
getch()でEnterを押すと13が返されると言うことだ。
13というのはおそらく'\r'と等しいと思われる。

'\n'は改行文字であるが、Enterを押すと'\n'が入力される保証はどこにもない。
ここまで書いてから気が付いたが、getch()は標準関数でないからしてスレ違いだ。
652デフォルトの名無しさん:2006/01/04(水) 11:34:48
getch は環境依存でスレ違い
653デフォルトの名無しさん:2006/01/04(水) 11:42:04
_getchは絶対に1文字しか受け付けないから
不正入力チェックが超楽
654デフォルトの名無しさん:2006/01/04(水) 12:17:43
>>624
マジレスすると、標準Cでの標準的な方法はない。

# ファイルの概念がないプラットフォームが存在するため
655デフォルトの名無しさん:2006/01/04(水) 12:27:03
while文使って1バイトずつちまちま書き込んで
freadの戻り値チェックしつつEOFまでループ

バイト長求めなくても何ともないぜ
656デフォルトの名無しさん:2006/01/04(水) 12:44:22
1バイトずつちまちま読んだら遅いじゃんかよ。
fread の戻り値使えよ。
657デフォルトの名無しさん:2006/01/04(水) 13:08:31
>>656
バッファリングしていると信じているのだから見かけ1Byteずつでも気にしないのさ。
658デフォルトの名無しさん:2006/01/04(水) 13:13:28
最終行がガンダムネタだと気付いて欲しかった独り身の正月明け
659デフォルトの名無しさん:2006/01/04(水) 13:42:33
>>657
1バイトずつ余計な処理が大量に入るのだから、
バッファリングされていようが無駄が多いぞ。
660デフォルトの名無しさん:2006/01/04(水) 14:27:09
>>654
それは freestanding environment の場合であって
hosted environment で論じる限り、ファイルの概念は「必ずある」ぞ
661デフォルトの名無しさん:2006/01/04(水) 14:29:10
>>659
無駄を実際に抑えるかどうかは場面ごとの必要性によるけど
気づいていない〜無関心のまま居直る奴とは組みたくないよな
662デフォルトの名無しさん:2006/01/04(水) 15:08:26
標準C縛りだったらfseek(fp, 0, SEEK_END)
でファイルの最後に持っていってftell(fp)でいいんじゃね?
663デフォルトの名無しさん:2006/01/04(水) 15:23:04
まあ、大抵機種依存の関数使うんだけどな。
どうしても移植性が欲しいってんなら、
関数化して、#if で分岐して定義を変えて、
#else で fseek, ftell 使えばいい。
664デフォルトの名無しさん:2006/01/04(水) 16:30:09
unsigned intってなんて読むのデツカ
665デフォルトの名無しさん:2006/01/04(水) 16:41:57
アン サイン ド インテジャー
もしくは
アンサインド イント
666デフォルトの名無しさん:2006/01/04(水) 16:52:27
>>665
ありがとう、最後にもう一つだけ教えて下さい
ANSI Cでベキ乗の計算する場合、特別な関数とか読み込まないと出来ないのでしょうか?
#include <stdio.h>
main()
{
int x = 2;
printf("2の2乗は%d\n", x ^ 2);
}
こうしたら、0が表示されてしまいました、ベキ乗の計算させるのにはどうしたらできますか、
オナガイシマス
667デフォルトの名無しさん:2006/01/04(水) 17:00:03
>>666
ハットは C では排他的論理和でありべき乗ではない
C ではべき乗は自分で作るかサードパーティ製のライブラリを探すことになる
ただし 2 の n 乗は 1 << n で求まる
668デフォルトの名無しさん:2006/01/04(水) 17:00:44
>>667
pow
669デフォルトの名無しさん:2006/01/04(水) 17:03:15
そうだった・・・ アフォ>自分
670デフォルトの名無しさん:2006/01/04(水) 17:05:04
>>667
ありがとう、勉強になりマスタ
671デフォルトの名無しさん:2006/01/04(水) 17:08:23
頼むから2の冪乗ごときにpow()を使わんでくれ。
672デフォルトの名無しさん:2006/01/04(水) 17:10:08
2のべき乗じゃなくてnのべき乗を求めたいんでしょ?
>>666は例として2^2を出しただけで
673デフォルトの名無しさん:2006/01/04(水) 17:18:06
2乗なら x * x で良いと思うがね。
674デフォルトの名無しさん:2006/01/04(水) 17:27:58
666です、みなさんどうもありがとう
>>672さん
短順に2のベキ乗が知りたかっただけです実は、今年、基本情報技術者資格を
受験しようと思っていて、午前問題の参考書の中で

平成16年度春問10

 2種類の文字"A","B"を1個以上、最大n個並べた符号を作る。60通りの
符号を作るときのn個の最小値は幾らか。

という問題を見て答えは5個なのですが、そう言えばc言語で
2のベキ乗ってどうしたら計算できるのだろうかと思い、borland C++
でやって見たのですが、うまく出来なかったので、
ここで質問させてもらいました、ありがとうございました。
675デフォルトの名無しさん:2006/01/04(水) 17:56:29
英文のような、スペースを含んだ文字列を標準入力から得たいのですが、方法が思いつきません。

どんな方法があるでしょうか?
676デフォルトの名無しさん:2006/01/04(水) 18:00:05
>>675
ちょっとした実験なら scanf が便利
パーサなどを作るときは本腰入れてトークン分解を作る

strtok もあるけど俺は勧めない
677デフォルトの名無しさん:2006/01/04(水) 18:00:10
>>675
scanfを注意深く使う。
678デフォルトの名無しさん:2006/01/04(水) 18:03:44
すいません プログラム初心者ですが、c言語を知ってれば今の時代のパソコンのソフトも作成できますよね?
679デフォルトの名無しさん:2006/01/04(水) 18:04:32
>>676,677
scanf("%s ",s)をループでも回し、一周ごとにスペースを挿入していこうと思ったのですが、
入力文字列にスペースが無い場合に対応できない上に、ループの終了条件がわかりません

>>677
「注意深く」とはどういうことでしょうか?
680魚チョコ:2006/01/04(水) 18:06:37
>>679
絶対に入力ミスしない
681デフォルトの名無しさん:2006/01/04(水) 18:09:58
fgetc(stdin)使えばスペースも一文字
682デフォルトの名無しさん:2006/01/04(水) 18:11:35
俺はfgets→sscanfの黄金コンビを勧めとく
683デフォルトの名無しさん:2006/01/04(水) 18:11:41
>>678
現に市販されているソフトのクローンが作れるかってこと?
それとも PG 職に就けるかってこと?


>>679
>入力文字列にスペースが無い場合に対応できない

どゆこと?
684デフォルトの名無しさん:2006/01/04(水) 18:14:21
つかscanfだって("%[]",s)ってやればスペースだろうがお構い無しだぜ
685デフォルトの名無しさん:2006/01/04(水) 18:22:48
>>681
ありがとうございます。
ループを回して、改行を終了条件にすればいいんですね

>>682
getsでできました!
こんな関数初めて知りました
ありがとうございます
sscanfについても調べてみます

>>684
試したのですが、入力を受け付けずに次の処理に行ってしまいます
686魚チョコ:2006/01/04(水) 18:25:26
gets を使ったのか ミ゚仝 ゚ ;ミ ..................
687デフォルトの名無しさん:2006/01/04(水) 18:25:47
>>683
>>入力文字列にスペースが無い場合に対応できない

>どゆこと?

入力する文字列が
"all people"などではなく
"everyone"のようにスペースを含んでいない場合です
688デフォルトの名無しさん:2006/01/04(水) 18:26:47
>>685
頼むからgets()だけは使わんでくれ。
689デフォルトの名無しさん:2006/01/04(水) 18:27:45
>>687
どっちも scanf("%s ",s); で入力できるはずだけど?
改行も空白の一種なのは認識してる?
690デフォルトの名無しさん:2006/01/04(水) 18:28:58
(σ・∀・)σgets()
691魚チョコ:2006/01/04(水) 18:30:53
だからこういうの作っとけよモー

int gets255(char* str)
{
  int  n, ch;

  n=0;
  while('o'){
    ch=getchar();
    if ( ch == 10 || ch < 0 ) break;
    if ( n < 255 ) { *str++=ch; n++; }
  }
  *str=0;
  return n;
}
692デフォルトの名無しさん:2006/01/04(水) 18:33:12
>>691
マジレスしていいんかウケ狙いかよーわからん
693デフォルトの名無しさん:2006/01/04(水) 18:33:51
>>691
そこで10とか使うようでは説得力0だな。
694デフォルトの名無しさん:2006/01/04(水) 18:35:01
頼むから糞みたいなgets255()なんて使わないでくれ。
695デフォルトの名無しさん:2006/01/04(水) 18:36:17
>>678
C言語だけじゃ絶対無理。
696魚チョコ:2006/01/04(水) 18:44:09
>>693
ch < 0 だって味になってないか? ミ ゚ 〜゚ミ
697魚チョコ:2006/01/04(水) 18:48:33
>>695
それはなぜ? どこに何語を使えばええ? ミ ゚ 〜゚ミ
698デフォルトの名無しさん:2006/01/04(水) 18:52:46
>まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
699デフォルトの名無しさん:2006/01/04(水) 18:55:33
>>697
プログラミング言語ができるということは言うなれば基礎。
実際に何かソフトウェアを作ることは応用に当たる。

その差が有るから695の言うとおりで、
Cだけではソフトウェアを作ることができない。
700デフォルトの名無しさん:2006/01/04(水) 19:04:58
>>685
ちょwwwwwwwww
俺が言ったのはgetsじゃなくて「f」gets
getsは何文字でも読んじゃうからマジヤバス
701デフォルトの名無しさん:2006/01/04(水) 19:12:09
>>700
なるほど
だからfgetsなんですね
勘違いしてました・・・
fgets(stdin,*,s)に変更します
702デフォルトの名無しさん:2006/01/04(水) 20:12:55
ポカーンですな
703デフォルトの名無しさん:2006/01/04(水) 20:15:13
>>702
fgets(s,*,stdin)ですね・・お恥ずかしい
704デフォルトの名無しさん:2006/01/04(水) 20:32:23
文字列リテラルのsのサイズを数え間違えると、fgetsを使う利点がなくなるから、
fgets(s, sizeof(s)/sizeof(s[0]),stdin) とやると安心。
さらにfgetsの戻り値がnullでないかエラーチェックする方法もある。
705704:2006/01/04(水) 20:36:39
間違い探しになって(ry
706魚チョコ:2006/01/04(水) 20:55:07
>>704
null ってぜんぶこも字でいいんだっけか? ミ ゚ 〜゚ミ
707魚チョコ:2006/01/04(水) 20:56:51
>>704
というかそこで文字列リテラルと書くのは正しいのだろうか? ミ ゚ 〜゚ミ
708デフォルトの名無しさん:2006/01/04(水) 21:02:20
ミ ゚ 〜゚ミ
709704:2006/01/04(水) 21:38:15
他にもあるよ、間違い探し >魚チョコ
710デフォルトの名無しさん:2006/01/04(水) 22:25:10
sittaka
711デフォルトの名無しさん:2006/01/04(水) 22:45:06
魚チヨコも気づかない致命的な間違いを俺には分かる・・・
そう!!セミコロンが無い!!!(`∀´)
712デフォルトの名無しさん:2006/01/04(水) 22:48:58
sizeof(s)/sizeof(s[0]) は配列の要素数、サイズは単にsizeof(s)でおk
713デフォルトの名無しさん:2006/01/04(水) 23:20:00
sizeof は関数じゃなく演算子
714デフォルトの名無しさん:2006/01/04(水) 23:32:31
はて、今の流れで誰かsizeofが関数だといった人はいたでしょうか?
715デフォルトの名無しさん:2006/01/04(水) 23:33:52
712
716デフォルトの名無しさん:2006/01/04(水) 23:36:34
>>704
そういえばsizeofで型でもないのに括弧をつけるのはやや一般的ではないと思う。
717デフォルトの名無しさん:2006/01/04(水) 23:40:24
俺は見やすいから変数も型も"()"で括るけど
718デフォルトの名無しさん:2006/01/04(水) 23:54:06
個人的主観に凝り固まってる奴とは話すだけ無駄
719デフォルトの名無しさん:2006/01/04(水) 23:54:33
retuenに()を付けない派の俺が来ましたよ。
720デフォルトの名無しさん:2006/01/04(水) 23:56:16
文法作法は好みの問題,突っ込むとアレるよ?
721デフォルトの名無しさん:2006/01/04(水) 23:57:16
>>716
() を必ずつけるという主張(というより宣言か)は明白に非標準
722デフォルトの名無しさん:2006/01/04(水) 23:57:44
せんせい、retuenってなんですか!
723デフォルトの名無しさん:2006/01/04(水) 23:58:02
リターンにはつけないけど、sizeofにはつけるな。式中で使うか使わないかが
ポイントかも。
724デフォルトの名無しさん:2006/01/05(木) 00:00:47
returnにもsizeofにも()をつけるオレ様は非標準ですかそうですか
725デフォルトの名無しさん:2006/01/05(木) 00:01:20
>>721
非標準ってのは、標準Cではないという意味?
726デフォルトの名無しさん:2006/01/05(木) 00:01:29
>>720
「個人的」好みという主張は論議に値しない
727デフォルトの名無しさん:2006/01/05(木) 00:02:10
>>725
() がなきゃ ill-formed とでも言わんばかりに金切り声くるもん
728デフォルトの名無しさん:2006/01/05(木) 00:04:09
空文ですら許容されてる言語で、わざわざ論議するほどのことじゃないと毎度思うが、
それでもやめないんだよな、、、
729デフォルトの名無しさん:2006/01/05(木) 00:04:16
だから言ってんだろ、目玉焼きには醤油だって!
ソースなんて掛けてんじゃねえよ、バカ!
730デフォルトの名無しさん:2006/01/05(木) 00:05:02
>>729
俺は塩・胡椒派
731デフォルトの名無しさん:2006/01/05(木) 00:05:22
いや、片面焼きの半熟に決まってる。
732デフォルトの名無しさん:2006/01/05(木) 00:05:37
標準だろうがなんだろうが、コンパイラが式を評価できればいいじゃんか。
733デフォルトの名無しさん:2006/01/05(木) 00:07:51
どうせなら、すべての式に()つけろよ。規格には反してないぞ。
734デフォルトの名無しさん:2006/01/05(木) 00:08:14
>>732
確かに腹に入れば気にならないが、その前に味わいたいじゃん
735デフォルトの名無しさん:2006/01/05(木) 00:11:29
え?sizeofには必ず()付ける派だけどこれ文法違反なの?
736デフォルトの名無しさん:2006/01/05(木) 00:13:00
737デフォルトの名無しさん:2006/01/05(木) 00:13:08
>>735
どこを読んで文法違反だと?
738デフォルトの名無しさん:2006/01/05(木) 00:13:56
派とか言い出すガイキチはいなすのみ
739デフォルトの名無しさん:2006/01/05(木) 00:15:18
目的意識がない〜ずれてる奴とは空回りするだけだし
740デフォルトの名無しさん:2006/01/05(木) 00:16:34
またどうでもいい事で荒れてるな
どっちでも問題ないなら好きな方使えばいいじゃねーか
741デフォルトの名無しさん:2006/01/05(木) 00:17:16
問題はある
何に照らして問題かが
いくら言っても通じない
742デフォルトの名無しさん:2006/01/05(木) 00:42:36
>>741
ごめんなさい
どういう場合にカッコをつけるorつけないのが問題に
なるのかよくわからないので具体例で教えていただけると・・・
743デフォルトの名無しさん:2006/01/05(木) 00:46:08
そんな枝は末節はどうでもいい
そいつが根ざしている基本方針があさってを向いているんだよ
744デフォルトの名無しさん:2006/01/05(木) 00:50:50
>>742
所属している何らかの団体のコーディング規則に反していない限りは、
何も問題にならない。ただの好みの問題。
745デフォルトの名無しさん:2006/01/05(木) 00:53:45
*:「なにい!? 俺のコードにケチつける根拠法令を言ってみろお!! コーディング基準の第何条だ! え、おい貴様ボコすぞこら
746デフォルトの名無しさん:2006/01/05(木) 00:55:00
「えだは」って何??
747デフォルトの名無しさん:2006/01/05(木) 00:55:43
枝葉の誤変換
748デフォルトの名無しさん:2006/01/05(木) 01:01:39
>>746
枝葉末節の誤入力
749デフォルトの名無しさん:2006/01/05(木) 01:10:20
ある関数を作って、引数をもらう際に、その引数の中身が
文字列か整数かを見分ける方法ってありますか?

また、その情報(文字列または整数)をlongの型に入れてさらに他の変数に付加情報をつけ
表示方法を変えたいのですが・・・

例:
long *AAA; /* AAAの中身はわからない */
long BBB; /* BBBの中身が0ならAAAを文字列として表示 */
        /* BBBの中身が1ならAAAを整数として表示 */

できますか?
750デフォルトの名無しさん:2006/01/05(木) 01:15:03
>>749
できない

つーか、自分で答え書いてるやん
型情報をつければいい
751デフォルトの名無しさん:2006/01/05(木) 01:15:58
>>749
>long *AAA; /* AAAの中身はわからない */
どうみてもAAAの中身はlong型のポインタだし
*AAAはlong型に決まってるよな

C++じゃあるまいし引数として受け取る変数の中身なんて決まってるだろ
752デフォルトの名無しさん:2006/01/05(木) 01:17:56
>>749
AAAから変換したい文字列と整数が、どんな値の範囲かにもよるが、
やろうと思えばできるけど、かなりアクロバット。
本当にそんな仕様にしないといけないのか、
プログラム設計から考え直した方がいい。
753デフォルトの名無しさん:2006/01/05(木) 01:19:10
チャンクとか作ってると出てきそう
754デフォルトの名無しさん:2006/01/05(木) 08:58:47
a = sizeof(int) * 10
a = sizeof int * 10
後者はきもくないか?
755デフォルトの名無しさん:2006/01/05(木) 09:15:50
テラキモス
756デフォルトの名無しさん:2006/01/05(木) 09:19:18
>>754
その前に後者はコンパイルエラー。
757デフォルトの名無しさん:2006/01/05(木) 09:34:28
カッコ無しはやったこと無かったんでエラーになるとは知らなかったよ。
つーか、ならカッコ必須じゃん。カッコ無しで使ってるやつテラフシギ
758デフォルトの名無しさん:2006/01/05(木) 09:35:14
a = sizeof a * 10;
a = -a * 10;
a = *p * **pp;
単項がきもいやつぁ C 界では異端だよ
黙ってる分には構わんがガタガタ言うやつは氏ね
759デフォルトの名無しさん:2006/01/05(木) 09:37:48
>a = *p * **pp; 
*pで助かってる様なもんで、pにだったら途端に括弧つけるんだろ?
760デフォルトの名無しさん:2006/01/05(木) 09:43:33
言ってる意味わかんね
761魚チョコ:2006/01/05(木) 09:47:43
sizeof って長くていやんだから #define o sizeof ってやっちゃってますが何か? ミ ゚ 〜゚ミ
762デフォルトの名無しさん:2006/01/05(木) 09:49:09
記号の単項は小学生のころからなじみあるからね。問題ない。

ってか、 sizeof int って書くとエラーになるじゃん。かっこつけ
たくないとか好みの問題じゃないよ。

ユーザー定義型だとカッコ無しでも平気みたいだけど、内蔵型と
そうでないとき書き方を変えてるほうが一貫性無いだろ。
763デフォルトの名無しさん:2006/01/05(木) 10:00:43
>ユーザー定義型だとカッコ無しでも平気みたいだけど

仕様を理解してないやつが一貫性とは笑わせてくれる
764デフォルトの名無しさん:2006/01/05(木) 10:03:43
実際試してそうなったんだからそう書いたんだよ。VC6な。
お前のとこのコンパイラじゃどうかしらんが
765デフォルトの名無しさん:2006/01/05(木) 10:06:11
VC6 に限ったことじゃないが、ん? と思ったら規格票くらいあたれ
愚にもつかない即レスは煽り屋以外の誰も期待してない
766デフォルトの名無しさん:2006/01/05(木) 10:08:27
だからお前のところのコンパイラは sizeof int でエラーにならんのか?
767デフォルトの名無しさん:2006/01/05(木) 10:10:15
俺んとこのコンパイラでは int は「ユーザ定義型」じゃないんでね
768デフォルトの名無しさん:2006/01/05(木) 10:13:11
はあ? どこに int がユーザー定義型だと書いてある?
日本語読めないのか?
769デフォルトの名無しさん:2006/01/05(木) 10:19:47
どっちでもいいよ

もともと「式」と「識別名」は文法上あらわれる位置が全然違うもので
たまたま sizeof のところが似てるからって同じにしなきゃならんという道理はない

どうしても sizeof の第1オペランドが型識別子の場合の括弧を必須にしたいんなら
あんたが ISO のワークグループにでも参加したらどうだ?
770デフォルトの名無しさん:2006/01/05(木) 10:20:50
あ、失礼
s/「識別名」/「型識別名]/
771デフォルトの名無しさん:2006/01/05(木) 10:21:02
>>757とほか数名
型名ではなく、式ならsizeofには括弧が要らない。
772デフォルトの名無しさん:2006/01/05(木) 10:40:41
-sizeof の第1オペランドが型識別子の場合
+sizeof の第1オペランドが式の場合

あーあ、何やってんだろ俺・・・
773デフォルトの名無しさん:2006/01/05(木) 14:03:15
て言うか上で小理屈並べてる奴頭大丈夫か?
そもそもカッコつけないとエラーになるんだったら議論の余地ないじゃんよ
774デフォルトの名無しさん:2006/01/05(木) 14:03:48
おれは,
「sizeof の取り得るオペランドは``式''か``キャスト''」
って, 覚えさせられた.
表現に問題はあるが, 現実的には無問題.
775デフォルトの名無しさん:2006/01/05(木) 15:07:11
だからインスタンスやユーザー定義型ならカッコ無しでもいけるが、
組み込みだと駄目っぽい。組み込み型でカッコ無しだとあいまいな
ところが生じるとも思えんのだが、何でだろ?

まあ、カッコ書いとけば間違いない。

returnはどんな場合でもカッコ無しで問題ないからつけなくても
問題ない。
776デフォルトの名無しさん:2006/01/05(木) 16:00:24
一貫性がどうこう言っている奴は単文に{}を必ず付けるの?
複文の時には{}を付けなければならないけど。
777デフォルトの名無しさん:2006/01/05(木) 16:12:20
つけるよ
778魚チョコ:2006/01/05(木) 16:15:47
{done:;}
779デフォルトの名無しさん:2006/01/05(木) 16:22:25
>>777
付けるとこんなことに...

---test.c---
int
main()
{
{struct x {struct x *next; char *data;};}
{struct x *xp;}
{struct x x0;}
{xp = &x0;}
/* 続く */
}
---

% cc test.c
test.c: In function `main':
test.c:6: error: storage size of 'x0' isn't known
test.c:7: error: `xp' undeclared (first use in this function)
test.c:7: error: (Each undeclared identifier is reported only once
test.c:7: error: for each function it appears in.)
test.c:7: error: `x0' undeclared (first use in this function)
%

780デフォルトの名無しさん:2006/01/05(木) 16:38:36
{ >>779; }
781{魚チョコ;}:2006/01/05(木) 16:44:50
{goto >>779;}
782デフォルトの名無しさん:2006/01/05(木) 16:47:44
{ new >>779; }
783デフォルトの名無しさん:2006/01/05(木) 17:04:05
free(>>779);
>>779=NULL;
784デフォルトの名無しさん:2006/01/05(木) 17:43:24
>>776
マジレスするとつけたほうが良い。現実そうなってるかどうかは
別問題だが、つけたほうがいいには違いない。
785デフォルトの名無しさん:2006/01/05(木) 17:55:41
>>775
ユーザー定義型も括弧が必要だと思うが。
786デフォルトの名無しさん:2006/01/05(木) 17:55:59
>>776
> 一貫性がどうこう言っている奴は単文に{}を必ず付けるの?
> 複文の時には{}を付けなければならないけど。

{}を付けた時点で単文ではなくなるだろ。
787{魚チョコ;}:2006/01/05(木) 18:12:13
{>>784;}
はいはい、{ /* コメントもちゃんと { } で囲んでおこうね */ }
{ // てゆーかこの手のネタを食っちゃいけないのか ミ゚仝 ゚ ミ
}
788デフォルトの名無しさん:2006/01/05(木) 18:20:38
まぁ、阿呆な糞コテはさておき、漏れも一行野郎以外は複文化するな。
つまり、
if (foo < bar) foo = bar;
for (p = str; *p; ++p) ;
こう書くか
if (foo < bar) {
foo = bar;
}
for (p = str; *p; ++p) {
}
こう書く。
789デフォルトの名無しさん:2006/01/05(木) 18:23:28
>>788
str代入してインクリメントってなんか違和感感じるなw

俺は前者だな。
790デフォルトの名無しさん:2006/01/05(木) 18:27:26
>>785
コンパイラなんだい? VC6だとユーザー定義型(構造体とか)
はカッコ無しでも通るよ
791{魚チョコ;}:2006/01/05(木) 18:32:07
>>788馬鹿
おやおや、素早いレスだことで。考え変えた。ここって辛気臭いプログラムでたまったストレスを発散させるとこだったのねえ。
てえわけで
for ( p=str; *p; ++p ) ;
だ。末尾のセミコロンが軽くて見づらいから、どうせなら、
for ( p=str; *p; ++p ) { ; }
と書くか、
for ( p=str; *p; ++p ) {
;
}
と書いた方がああしっかり空ループなんだなあとわかっていいんじゃないか? >>788みたいな馬鹿が好きそうなコードだこのチンカス ミ ゚ 〜゚ミ
792デフォルトの名無しさん:2006/01/05(木) 18:44:33
>>790
俺はVC7.1を使っていて括弧をつけないとだめだが、
VC6なら通るという問題ではなくて、規格で構文がそう定められているから必要なんだ。
793デフォルトの名無しさん:2006/01/05(木) 18:47:25
お前らここ行け。

C/C++ Coding Style Thread
http://pc8.2ch.net/test/read.cgi/tech/1096687703/l50
794デフォルトの名無しさん:2006/01/05(木) 19:05:12
>>792
>規格で構文がそう定められている
つうことはVC6が基準を満たしてないのね。了解。
まあおれはsizeofにはカッコつける派なので問題ない。
795デフォルトの名無しさん:2006/01/05(木) 20:02:12
>>794
>>765 と >>769 で答えが出てるのに
まだ引っ張ってたのか。乙。
796デフォルトの名無しさん:2006/01/05(木) 20:38:48
>>779
宣言と文は区別しろ。C++じゃないんだから。
797デフォルトの名無しさん:2006/01/05(木) 21:13:43
>>791
>>788馬鹿
他人を馬鹿呼ばわりかよ、だからうざいってんだ。

>おやおや、素早いレスだことで。考え変えた。ここって辛気臭いプログラムでたまったストレスを発散させるとこだったのねえ。
悪いな、たまたまだ。現にこのレスは遅れたからな。

>てえわけで
>for ( p=str; *p; ++p ) ;
>だ。末尾のセミコロンが軽くて見づらいから、どうせなら、
>for ( p=str; *p; ++p ) { ; }
>と書くか、
>for ( p=str; *p; ++p ) {
>;
>}
>と書いた方がああしっかり空ループなんだなあとわかっていいんじゃないか? >>788みたいな馬鹿が好きそうなコードだこのチンカス ミ ゚ 〜゚ミ
つーか、見づらいというより醜いな。まるで糞コテ愛用のAAのようだ。
798デフォルトの名無しさん:2006/01/05(木) 22:13:25
魚チョコはバカなのでいじらないように。
799デフォルトの名無しさん:2006/01/05(木) 22:18:04
>>798
支持する
800デフォルトの名無しさん:2006/01/05(木) 23:20:23
>749は言ってることが意味不明
801デフォルトの名無しさん:2006/01/06(金) 00:31:12
char* string = "the quick brown fox jumped over the lazy dog.";
func((DWORD)string); // C4311: warning C4311: 'type cast' :

上記のC4311: warningを#pragmaなどを使わずに抑制する方法を教えていただけませんか?
802デフォルトの名無しさん:2006/01/06(金) 00:37:14
ポインタをDWORDにキャストするのは何故?
803魚チョコ:2006/01/06(金) 00:39:27
>>800
そりゃ printf に似たことをしたいってんだろう。正確には分からないが……。

問題は "long *AAA"。AAA がポインターなのは分かるが、AAA を参照した先に文字列があるのかどうかだ。
もしかすると 【呼ぶ前】 *AAA=0x30313233; みたいな固定長文字列(つーか多バイト文字定数)かもしれないし。そうなりゃエンディアンの影響受けるし。
もしかすると、【呼ばれて】 char *CCC; CCC=(char*)AAA; として扱って欲しいのかもしれないし。
もしかすると 【呼ぶ前】 *AAA=(long)"uochoco"; long 整数と文字列の先頭へのポインターが記憶場所を共用してるのかもしれないし。そうなるとポインターが long に納まりきるかunion 使えって話になるし。
804801:2006/01/06(金) 00:40:47
早速どうも。
インタフェイスがDWORDなのですが、
そのDWORDをまた新たにポインタにキャストしなおして再利用したいのです。
windowsでいうとSetWindowLong();のような感じです。
805デフォルトの名無しさん:2006/01/06(金) 00:44:25
>>804
プロジェクトのプロパティ→C/C++→General→Detect 64-bit Portability IssuesをNoに。
あとスレ違い。
806804:2006/01/06(金) 00:50:28
>>805
言語レベルでは抑制できないんですね。
このwarningを出すのはVC++の仕様だとしたらVC++の設定で抑制してもいいですね。
どうもありがとうございました。

>あとスレ違い。
そのようでしたね。失礼しました。
807806:2006/01/06(金) 00:55:12
ああそうか64bit対応のコンパイラだとポインタが64bitの可能性もあるから
それをDWORDにキャストすると情報が欠如するってんでwarningが出るんですね。
すっきりしました。
808デフォルトの名無しさん:2006/01/06(金) 01:12:11
何スレ違いのレスして勝手にすっきりしてんだ
809デフォルトの名無しさん:2006/01/06(金) 01:32:27
>>804
> インタフェイスがDWORDなのですが、
> そのDWORDをまた新たにポインタにキャストしなおして再利用したいのです。

ポインタをDWORDにキャストして、受け側でポインタ型にキャストし直す、
など、腐った設計するな。
素直に void * で渡して、型を識別する情報と、
void * で示す先のオブジェクトのサイズを渡しておけ。

# 元々主旨の違うI/Fを参考にするな!
810デフォルトの名無しさん:2006/01/06(金) 01:36:46
>>809
しかしSetWindowLongを使ったポインタの受け渡しは、
ウインドウをクラスにカプセル化する際に必ずといっていいほど出てくるけどね。
スレ違いだな。
811デフォルトの名無しさん:2006/01/06(金) 01:41:29
10年以上前に設計された失敗作がいつまでも使われるハメになっただけのこと
812デフォルトの名無しさん:2006/01/06(金) 04:41:48
\x1b[2J
で文字が消えるはずですけど消えません。
何でですか?
813デフォルトの名無しさん:2006/01/06(金) 05:19:38
>>812
それは端末の都合。言語とは関係ないのでスレ違い。
814デフォルトの名無しさん:2006/01/06(金) 07:00:53
>810
SetWindowLongPtr
815デフォルトの名無しさん:2006/01/06(金) 13:49:19
typedef struct {
unsigned char r, g, b;
} pixel;

static pixel red = {255, 0, 0};

こんな感じで、ピクセルを表す構造体と基本的な色の変数が定義されたヘッダがあるんですが
このヘッダをincludeしたファイルをコンパイルすると
"redが定義されてるけど使われてないぞ"って類のwarningが大量に出ます。

基本色のピクセルはよく使用するのであらかじめ定義しておきたいのですが、
使わないときにはwarningが出てしまうので嫌なんです。
このwarningを回避する方法って無いでしょうか?
816デフォルトの名無しさん:2006/01/06(金) 13:52:19
>>815
constつけてもダメ?
gccで-std=c99ならそれでいけそうだが。
#つーか、該当環境スレ向けか?
817デフォルトの名無しさん:2006/01/06(金) 14:13:51
自分で調べてみたのですがよくわからなかったのでお願いします。
Fortranで書かれたプログラムをCで使いたいのですが方法がわかりません。
またはFortranソースをCに書き換えてくれるようなソフトはありますか?
ttp://www.vector.co.jp/soft/win95/prog/se056813.html
を見つけたのですがVC6を使っているのでよくわかりませんでした。
具体的に使いたいFortranソースは
ttp://www.simplex.t.u-tokyo.ac.jp/~sugihara/opensoft/3d/chull/sich3.f
です。
コンパイラは C:VC6、Fortran:インテルVisualFortran9.0です。
よろしくお願いいします。
818815:2006/01/06(金) 15:12:39
>>816
constつけたらいけました。ありがとうございます。
819デフォルトの名無しさん:2006/01/06(金) 16:44:10
>>817
f2cでなんとかならね?
820デフォルトの名無しさん:2006/01/06(金) 17:00:42
英文を入力して、その英文の過去形を出力するものなんですが、
fgetsとsscanfを使って一行入力ができるようにしていただきたい。
お願いします。
#include <stdio.h>
#include <string.h>

main()
{
int i;
char buf[100];
static char *dic[10][2] = { /*辞書*/
{"eat","ate"},{"move","moved"},{"copy","copied"},
{"die","dyed"},{"walk","walked"},{"take","took"},
{"hit","hit"},{"swim","swam"},{"run","ran"},{"play","played"}};

while (scanf("%s",buf) != EOF){
for(i=0; i<10; i++){
if(strcmp(buf,dic[i][0]) == 0) break;
}
if(i==10)
printf("%s\n", buf);
else printf("%s\n", dic[i][1]);
}
}
821デフォルトの名無しさん:2006/01/06(金) 17:01:06
さようなら
822デフォルトの名無しさん:2006/01/06(金) 17:11:51
>>820
宿題は宿題スレに。


俺って親切だな。
823デフォルトの名無しさん:2006/01/06(金) 17:13:20
mainは値を返せっつの
824デフォルトの名無しさん:2006/01/06(金) 17:16:27
void mainよりはましだ。
825デフォルトの名無しさん:2006/01/06(金) 18:39:34
C言語初心者の質問なんですが、
行列計算などをするとき、配列つかってプログラム書くよりポインタでプログラム書いた方が
演算速度が速いって聞いたんですが、どのぐらいの違うもんなんですか。
826デフォルトの名無しさん:2006/01/06(金) 18:43:53
>>825
乳首3つ分
827デフォルトの名無しさん:2006/01/06(金) 18:51:27
>>826
いやいや

マ○コ3つ半と○ンコ1つぶんくらいじゃね?わからんけど
828デフォルトの名無しさん:2006/01/06(金) 19:11:44
>>825
釣れますか?
829デフォルトの名無しさん:2006/01/06(金) 19:22:19
>>827
マ○コ4個半でいいじゃねーかよw
830デフォルトの名無しさん:2006/01/06(金) 19:52:57
>>825
君がポインタを使って書いたものより、俺が配列を使って書いたものの方が恐らく速い。
831デフォルトの名無しさん:2006/01/06(金) 19:53:19
>>825
実際のところ、現在のコンパイラはそれくらい最適化でどっちでも同じコードを吐く。
だから読みやすかったりわかりやすかったりするほうを選びなさい。
832デフォルトの名無しさん:2006/01/06(金) 19:53:55
>>825
君が配列を使って書いたものより、俺がポインタを使って書いたものの方が恐らく遅い。
833デフォルトの名無しさん:2006/01/06(金) 19:58:19
>>825
ポインタは速くて配列が遅い、
なんて迷信いつまでも信じるなよ。
834デフォルトの名無しさん:2006/01/06(金) 20:19:34
マジレスするとデータの大きさによる
835デフォルトの名無しさん:2006/01/06(金) 20:21:36
>>832
ダメじゃんw
836デフォルトの名無しさん:2006/01/06(金) 20:36:29
マジレスすると、もうかれこれ20年も前からコンパイラにとってはどちらも同じ。
837デフォルトの名無しさん:2006/01/06(金) 20:39:39
配列とポインタってあんまり律速要因にはならんような気がするのだが……。
アルゴリズムが同じなら、速度に影響があるのはこんなところ?
・使ってる変数が少なければ少ないほどよい。⇒レジスタへの割り当てや保存/復帰の手間が減る。
・演算間の依存関係が少なければ少ないほどよい。⇒スーパースカラ(スケイラ?)が効きやすくなる。
・分岐は少なければ少ないほどよい(特にループ中)。⇒パイプラインの乱れが減らせる。
・分岐するときの真と偽の比は大きければ大きいほどよい。⇒分岐予測が効きやすくなる。
・メモリアクセスは可能な限り局所化されているとよい。⇒データキャッシュが効きやすくなる。
・実行頻度の高い範囲がキャッシュの大きさ以下だとよい。⇒命令キャッシュが効きやすくなる。
838デフォルトの名無しさん:2006/01/06(金) 21:05:57
一応完成はしているのですが、どうもしっくりこないのでご教授いただけますと幸いです。
変数への入力を行い条件に合わなかった場合入力をやり直すプログラムについてです。
以下が簡易的に示したものですが、同じ入力文が2つもあってどうも不恰好になってしまい困っています。
実はこの部分を繰り返すため、例えば初めの入力文がないと2回目以降の繰り返しの時にスルーされてしまいます。

{ 入力文
  while(予期していない入力){
    入力文}
839デフォルトの名無しさん:2006/01/06(金) 21:08:58
>>838
それだけなら do-while でいい。

予期しない入力があった場合に特別な処理を挟みたい場合は、
goto 使うのが一番すっきりする。
840838:2006/01/06(金) 21:15:51
>>839
ありがとうございます!
do-whileの存在すら忘れていて変に詰まってましたorz
肩の荷が下りました。
841デフォルトの名無しさん:2006/01/06(金) 21:19:27
825です。
ありがとうございました。
本とか「高速に演算できるにポインタをつかったプログラム」とかかいてあるんですけど
あんまり関係なさそうですね。
842デフォルトの名無しさん:2006/01/06(金) 21:47:16
ぶっちゃけ最適化された数値演算ライブラリ使うのが一番早いし速い。
843デフォルトの名無しさん:2006/01/06(金) 21:47:53
838の書き方でもいいんじゃない?
844デフォルトの名無しさん:2006/01/06(金) 21:52:26
>>843
漏れもそう思う。
最適化しちゃうコンパイラもあるかも無いかもしれないし。
845デフォルトの名無しさん:2006/01/06(金) 21:55:18
て言うか速度がめっさ変わらない限りは見やすいプログラムが一番いい
さすがにバブルソートとかは論外だけど
846魚チョコ:2006/01/06(金) 21:56:50
空入力を2回繰り返したらキャンセルってのを実装するため
入力部分を2回並べるか誘導変数を使ってループにするか
悩んだことあったなあ。どっちがいいかねえ。
847魚チョコ:2006/01/06(金) 22:00:13
>>845
でもその泡でも今どきのPCじゃ1万項目1秒程度なんだよな……。
848デフォルトの名無しさん:2006/01/06(金) 22:40:56
泡姫降臨
849デフォルトの名無しさん:2006/01/06(金) 22:42:13
>>847
遅すぎ。
850デフォルトの名無しさん:2006/01/06(金) 23:19:23
1秒で遅いかどうかはアプリケーション依存
851デフォルトの名無しさん:2006/01/06(金) 23:21:58
どんなアプリでも1秒は遅すぎ。
852817:2006/01/06(金) 23:36:07
>>819
さきほどやってみようと試みましたが
Borland C++ Builderとf2cの使い方がよくわかりませんでした。
初心者なもので申し訳ないです。
853928:2006/01/06(金) 23:42:00
>>852
コンパイラの使い方はスレ違い。
http://pc8.2ch.net/test/read.cgi/tech/1135127048/l50
とかでも行けば?
854928:2006/01/06(金) 23:42:57
あ、番号が


まあいいやハッハー
855デフォルトの名無しさん:2006/01/07(土) 00:51:54
Video Killed The Radio Star
856デフォルトの名無しさん:2006/01/07(土) 06:28:29
Windowsのコードなのですが、おおよそCの問題だと思うので、お願い致しますm(_ _)m

#define PATHNAME "X.TXT"

この、PATHNAMEを使って
"X.TXT"
と、
L"X.TXT"
の両方を生成したいのですが、##が効きません。どう書けばよいのでしょうか?

dwResCnt = GetFullPathNameA(PATHNAME, BUFSIZE, pathname, &filename);
dwResCnt = GetFullPathNameW(L ## PATHNAME, WBUFSIZE, wpathname, &wfilename);
857デフォルトの名無しさん:2006/01/07(土) 06:50:30
>>856
##文字列連結演算子はマクロ定義の中でのみ有効。
858デフォルトの名無しさん:2006/01/07(土) 09:35:43
自己解決しません。
859デフォルトの名無しさん:2006/01/07(土) 10:31:16
づみません
C言語のフリーソフトってありますか?
860デフォルトの名無しさん:2006/01/07(土) 10:37:51
#define LPATHNAME L ## PATHNAME
なのかな?
861デフォルトの名無しさん:2006/01/07(土) 10:39:26
2 名前:デフォルトの名無しさん 投稿日:2005/06/02(木) 14:38:35
【コンパイラ】
gcc
http://gcc.gnu.org/

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

【ライセンスや機能などに問題あり】
Microsoft C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
Intel C++ Compiler for Linux
http://developer.intel.com/software/products/compilers/clin/noncom.htm
862デフォルトの名無しさん:2006/01/07(土) 11:00:14
TEXT(PATHNAME)はできない?
863デフォルトの名無しさん:2006/01/07(土) 11:06:05
>>862
それだと、UNICODEで内容が変わっちまうでしょ。
なぜだか分からんが、明示して呼び出したいみたいだし。
864デフォルトの名無しさん:2006/01/07(土) 11:35:35
つーか>>860でいいんじゃね?


ところでプリプロセッサで↓こんな変換するの何だったっけ?
QUOTE(Nullpo) → "Nullpo"
#だったかなにかを使ったと思うんだが思い出せん(;´Д`)
865デフォルトの名無しさん:2006/01/07(土) 11:42:06
#define XSTR(s) #s
#define STR(s) XSTR(s)
866デフォルトの名無しさん:2006/01/07(土) 11:44:35
#define Nullpo ((void*)0)

のとき

"Nullpo"としたいなら   XSTR(Nullpo)
"((void*)0)"にしたいなら STR(Nullpo)
867デフォルトの名無しさん:2006/01/07(土) 11:48:43
感動した!
868デフォルトの名無しさん:2006/01/07(土) 16:01:22
はいはいわかめわかめ
869デフォルトの名無しさん:2006/01/07(土) 16:45:36
勘当された!
870デフォルトの名無しさん:2006/01/07(土) 17:07:08
下記のようなプログラムを作るにはどのようにすれば良いのでしょうか?
わかる方がいましたら教えてください。よろしくお願いいたします。

ある自然数nを与えて、1〜nまでの数の考えられる並べ方(n!通り)を全て出力する。
例)n=3, 並べ方は3!=6通り。
--> 1-2-3, 1-3-2, 2-1-3, 2-3-1, 3-1-2, 3-2-1,
871デフォルトの名無しさん:2006/01/07(土) 17:28:07
goto 宿題スレ;
872デフォルトの名無しさん:2006/01/07(土) 17:44:14
static char nullpo[] = { "a", "b", "c", "d" };
これだと宣言の構文エラーが出てしまうのですがどうすれば良いでしょうか。
本当に初歩的ですみませんorz
873デフォルトの名無しさん:2006/01/07(土) 17:46:41
>>872
-"
+'
874デフォルトの名無しさん:2006/01/07(土) 17:48:32
>>870
#include <stdio.h>
#include <stdlib.h>

void swap(int *p, int *q)
{
int t = *p;
*p = *q;
*q = t;
}

int next_perm(int *n, int s)
{
int i = s, j = s, k;
while(--i > 0 && n[i - 1] >= n[i]){}
if(i <= 0) return 0;
for(k = i; i < --j; i++) swap(&n[i], &n[j]);
for(i = k; n[i] <= n[k - 1]; i++){}
swap(&n[k - 1], &n[i]);
return 1;
}
875デフォルトの名無しさん:2006/01/07(土) 17:49:02
int main(int ac, char **av)
{
int s, i, *n;
if(ac != 2){
fprintf(stderr, "Usage: perm N\n");
return 1;
}
if(!(s = atoi(av[1]))){
fprintf(stderr, "Error: N = %d\n", s);
return 1;
}
if(!(n = malloc(s * sizeof(int)))){
fprintf(stderr, "Error: no memory\n");
return 1;
}
for(i = 0; i < s; i++) n[i] = i;
do{
for(i = 0; i < s; i++) fprintf(stdout, "%d ", n[i] + 1);
fprintf(stdout, "\n");
}while(next_perm(n, s));
free(n);
return 0;
}
876デフォルトの名無しさん:2006/01/07(土) 17:52:28
>>873
static char nullpo[] = { 'a', 'b', 'c', 'd' };
で試しましたが、駄目でした。
877デフォルトの名無しさん:2006/01/07(土) 17:57:17
>>870
#include "stdio.h"
#define N 3
void search(int* pBuf, int pos){
int ic, jc, flag;
for (ic = 0; ic < N; ic++){
for (jc = 0, flag = 0; jc < pos; jc++){
if (pBuf[jc] == ic){
flag = 1;
break;
}
}
if (flag) continue;
if (pos + 1 == N){
for (jc = 0; jc < N - 1; jc++)
printf("%d - ", pBuf[jc]);
printf("%d\n", ic);
return;
}
pBuf[pos] = ic;
search(pBuf, pos + 1);
}
}

void main(void){
int data[N - 1] = {0};
search(data, 0);
}
878デフォルトの名無しさん:2006/01/07(土) 18:03:11
>>876
コンパイラは何を使っている?
gcc, Borland, VC あたりで通らないなら別なミスの可能性が高い
879デフォルトの名無しさん:2006/01/07(土) 18:11:14
static char *nullpo[] = { "a", "b", "c", "d" };

static char *nullpo = { 'a', 'b', 'c', 'd' };
880デフォルトの名無しさん:2006/01/07(土) 18:13:45
>>874 >>875 >>877
スレ違いの質問に
何嬉しそうに答えてんだ莫迦。
881デフォルトの名無しさん:2006/01/07(土) 18:16:53
>>878
Borlandです。
882デフォルトの名無しさん:2006/01/07(土) 18:17:43
>>880
自分が答えられなかったからって僻んでるのは大人気ないですよ
883デフォルトの名無しさん:2006/01/07(土) 18:24:55
>>879
大嘘書くなや。
884デフォルトの名無しさん:2006/01/07(土) 18:27:59
>>881
単純な勘違いしてるんじゃない? もう一度冷静になってコードを
じっくり見てみたら。
885デフォルトの名無しさん:2006/01/07(土) 18:46:32
""で囲むと'\0'が付加されますよ
886デフォルトの名無しさん:2006/01/07(土) 19:32:06
ところでここでは何を話すスレなんだ?
質問しても宿題スレか初心者スレに行けと言われるんだが
タイトル紛らわしいから変えた方がいいんじゃね?
887デフォルトの名無しさん:2006/01/07(土) 19:49:02
自然数 N が与えられたとき、
1 から N までの数字を N 個並べる組み合わせをすべて
列挙するプログラムは C で書くとどうなりますか?

例えば N = 3 のとき
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
となるようにです。
よろしくおながいします。
888デフォルトの名無しさん:2006/01/07(土) 19:49:52
丸投げ乙
889デフォルトの名無しさん:2006/01/07(土) 19:56:09
マルチ乙
890デフォルトの名無しさん:2006/01/07(土) 19:59:54
報告乙
891デフォルトの名無しさん:2006/01/07(土) 20:27:24
if(N=3)
printf("
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
");
892デフォルトの名無しさん:2006/01/07(土) 20:31:04
これにて 一件落着ぅ
893デフォルトの名無しさん:2006/01/07(土) 20:31:59
本当かよ
894デフォルトの名無しさん:2006/01/07(土) 20:37:21
それだと1 2 31 3 22 ... と表示されちゃうワ
895デフォルトの名無しさん:2006/01/07(土) 20:38:23
あっつ、ごめんスペースあったのネ
896デフォルトの名無しさん:2006/01/07(土) 20:53:20
static char *nullpo[] = { "a", "b", "c", "d" };

これのどこがウソなのか聞きたいんだがw
897デフォルトの名無しさん:2006/01/07(土) 21:09:32
メモリ確保についてなのですが、

  int i,j,n;
  int **p;

  n = 3;
  p = (int**)malloc(sizeof(int*)*n);
  for(i=0;i<n;i++){
    p[i] = (int*)malloc(sizeof(int)*n);
  }

というように二次元配列を動的に確保した場合、
メモリを開放するときは、ただ単に

  free(p);

と書けばいいのでしょうか?
898デフォルトの名無しさん:2006/01/07(土) 21:15:50
駄目に決まってる。mallocが書けるんなら逆回しでfree呼べ
899デフォルトの名無しさん:2006/01/07(土) 21:25:45
>>898
やはりmallocと同じ様にfreeしなければ駄目ですか。
スッキリしました、レスありがとうございます。
900899:2006/01/07(土) 21:30:15
何度もすみません。
一応聞いておきたいのですが、

  for(i=0;i<n;i++){
    free(p[i]);
  }
  free(p);

であっていますか?
901デフォルトの名無しさん:2006/01/07(土) 21:37:21
>>883
俺も聞きたいナ、どこが大嘘なんだ?
902デフォルトの名無しさん:2006/01/07(土) 21:45:11
903魚チョコ:2006/01/07(土) 21:55:33
>>900
合ってるけど普通に malloc(n*n*sizeof(int)) で駄目な理由はあるんですかね。
そのやり方だと何かとめんどくさいと思うんですけど。
904デフォルトの名無しさん:2006/01/07(土) 21:58:33
>>896
そっちじゃなくて、後の方だろ。
905デフォルトの名無しさん:2006/01/07(土) 22:02:27
>>886
「質問」と「丸投げ」の違いを憶えて出直しな
906デフォルトの名無しさん:2006/01/07(土) 22:05:18
>>903
malloc(n*n*sizeof(int)) は、これはこれで別の面倒がある
907デフォルトの名無しさん:2006/01/07(土) 22:09:58
これが最強
malloc(sizeof(int)*n*n + sizeof(int*)*n)
908デフォルトの名無しさん:2006/01/07(土) 22:17:21
>>903
メモリ確保自体では駄目な理由はないです。
多次元配列を用いず、一次元で済ますというのはもっともだと思います。

ただそれとは別の問題で、
とあるライブラリの関数に入力データの形式にあわせて、
二次元や、三次元の配列を指定してやらなければならないものがあって、
それが原因で今回は多次元で確保する必要がありました。

>>906
確かに一次元で全て済まそうとすると、
インデックスの計算などがやや煩雑になりがちですよね。
909デフォルトの名無しさん:2006/01/07(土) 22:29:48
ポインタテーブル作るのと、
添え字を乗算加算で計算するのは、一長一短やね。
910デフォルトの名無しさん:2006/01/07(土) 22:42:34
そゆこと
911デフォルトの名無しさん:2006/01/07(土) 22:59:44
ずっと前 ↓

#define HOGE_LOOP(s) for(c = 0; c < row; ++c){ if(DEC < c+m){ break; } ##s }
// 略
HOGE_LOOP(printf("[%d:]______________________\t", m+c);)

のような記述を見かけたのですが、ありかなしかって言えばどちらでしょうか
ずっと気になってたんでちょっと聞いてみます
912デフォルトの名無しさん:2006/01/07(土) 23:03:39
>>911
## が出てくる意味がわからん
913デフォルトの名無しさん:2006/01/07(土) 23:06:57
ありかなしかでいえばあり
ただ、こんなコード書いてきた奴はぶん殴るけど。
914デフォルトの名無しさん:2006/01/07(土) 23:09:01
>>912
トークンの接続じゃないか
915デフォルトの名無しさん:2006/01/07(土) 23:19:27
>>914
} と printf をつないでどうする気かがわからんと言っている
916デフォルトの名無しさん:2006/01/07(土) 23:24:48
>>915
はぁ?
917デフォルトの名無しさん:2006/01/07(土) 23:25:05
>>915
素直に無駄な記述と受け取っちゃ駄目なの?
918デフォルトの名無しさん:2006/01/07(土) 23:25:32
ひぃ?
919デフォルトの名無しさん:2006/01/07(土) 23:27:31
>>917
今回たまたま s が printf(〜); だったんで意味が通らなかったのかという見方は当然している
では、s に何が入ったとき ## に意味が出てくるのか? そこがわからんと言っている
920デフォルトの名無しさん:2006/01/07(土) 23:32:16
>>919
文法上、センテンスを入れないと無理っぽいね
921デフォルトの名無しさん:2006/01/07(土) 23:43:56
static char *nullpo = { 'a', 'b', 'c', 'd' };

これってビルド通らないんだっけか。

まあ素直にこうかいたほうがいいけど。
static char *nullpo = "abcd";
922デフォルトの名無しさん:2006/01/07(土) 23:58:35
>>911
つーか、GCC じゃプリプロセス通らんのだが。
その ## のところで。
923デフォルトの名無しさん:2006/01/07(土) 23:59:06
はじめまして。質問させていただきます。
a=1かつb=2、またはa=2かつb=3。というのは
(a==1)&&(b==2)||(a==2)&&(b==3)
これでいいのでしょうか
それとも
((a==1)&&(b==2))||((a==2)&&(b==3))
こうですか??
初心者ですがよろしくお願いします
m(_ _)m
924デフォルトの名無しさん:2006/01/08(日) 00:00:54
>>923
その場合はどっちでもいいんだけど、見やすさを考えて後者を使うべき
925デフォルトの名無しさん:2006/01/08(日) 00:03:28
( a == 1 && b == 2 ) || ( a == 2 && b == 3 )
926デフォルトの名無しさん:2006/01/08(日) 00:05:09
>>924
工エェ工エェ(゜Д゜(゜Д゜)゜Д゜)ェエ工ェエ工
927デフォルトの名無しさん:2006/01/08(日) 00:05:17
>>924
嘘吐くな
928デフォルトの名無しさん:2006/01/08(日) 00:05:42
>>923
むしろカッコ要らない。
929デフォルトの名無しさん:2006/01/08(日) 00:07:28
>>920
どゆこと?
930923:2006/01/08(日) 00:14:13
みなさんありがとうございました
とりあえず、925さんのようにやってみます。
931デフォルトの名無しさん:2006/01/08(日) 00:35:18
>>927
ん?別に間違ってないと思うが
932デフォルトの名無しさん:2006/01/08(日) 00:38:07
>>930
演算子の優先順位を調べてみ

これらの演算子の優先順位は == > && > || だから、

(a==1)&&(b==2)||(a==2)&&(b==3)
((a==1)&&(b==2))||((a==2)&&(b==3))
(a==1&&b==2)||(a==2&&b==3)
a==1&&b==2||a==2&&b==3

これらすべて同じ。でも、見易さを考慮して(a==1&&b==2)||(a==2&&b==3)が
いいと思う

933デフォルトの名無しさん:2006/01/08(日) 00:39:53
まあ&&と||の優先順位が同じだと勘違いしてる人は多い罠
934デフォルトの名無しさん:2006/01/08(日) 00:42:37
うだうだ言う前にコンパイルしる!
935デフォルトの名無しさん:2006/01/08(日) 00:43:07
>>933
ただのアフォ
936デフォルトの名無しさん:2006/01/08(日) 00:43:49
論理「和」と論理「積」だから&&の優先順位が高いという話を聞いたことがある。
937デフォルトの名無しさん:2006/01/08(日) 01:02:57
>>936
リッチーの意図はおそらくそうだろう
だが今は関係ない単なる仕様で、一般の使用者は従うのみ

ISO C は原案者の手からは離れた存在で
現にリッチーでさえ確信のない機能が盛り込まれている
938デフォルトの名無しさん:2006/01/08(日) 01:18:11
>>935
オマエはドアホウなのは確定な、927は恥カキっこちゃん
932が正解、933、931、924も正しい
939デフォルトの名無しさん:2006/01/08(日) 01:20:30
>>938
あ、勘違いしたか?
優先順位を間違えてる連中をアフォだと言ったんだが
940デフォルトの名無しさん:2006/01/08(日) 02:02:32
>>933
実装によって違ったぞ
941デフォルトの名無しさん:2006/01/08(日) 02:03:56
俺はカッコつけるな
省略して「知らない奴が馬鹿」と悦に入ってるのは真の馬鹿
942デフォルトの名無しさん:2006/01/08(日) 03:20:53
処理系依存だ、馬鹿。
943デフォルトの名無しさん:2006/01/08(日) 03:23:34
>>941
そういうご託は言葉を憶えてからにしな坊や
主語が「俺は」になってるうちは接点ねえけど
944デフォルトの名無しさん:2006/01/08(日) 03:23:53
>>940
&&と||の優先度が&& > ||なのは(少なくとも)C99では規定されてる
JIS X 3010:2003嫁

6.5の注釈で演算子の優先度は箇条の順序と同一と書かれていて
6.5.13に&&、6.5.14に||がある
945デフォルトの名無しさん:2006/01/08(日) 03:24:00
>>942
俺用語で話すなよ
946デフォルトの名無しさん:2006/01/08(日) 03:25:13
>>944
いや待て、規格合致でない処理系の目撃証言かも知れんぞ
947デフォルトの名無しさん:2006/01/08(日) 03:25:45
>>946
そんな処理系は窓からry
948デフォルトの名無しさん:2006/01/08(日) 03:28:17
>>947
始末書で済めばラッキーだね
949デフォルトの名無しさん:2006/01/08(日) 06:30:34
949
950デフォルトの名無しさん:2006/01/08(日) 06:31:36
950踏み逃げ
951デフォルトの名無しさん:2006/01/08(日) 07:17:52
>>887
1.まずint型のN個の数字の入る配列を作成して1〜Nまでの数字を格納
2.1で作った配列の中から数字を1つ取り出して1桁目に格納
3.N−1個の数字の入る配列を作成して、2で取り出した数字を抜いた1〜Nまでの数字を格納
4.3で作った配列の中から数字を1つ取り出して2桁目に格納
5.N−2個の数字の入る配列を作成して、2と4で取り出した数字を抜いた1〜Nまでの数字を格納
6.この作業を全桁埋まるまで繰り返す
7.1〜6をN回繰り返して終了

3と5のところで配列を作成するのではなくて使用した数字にフラグを立ててもよい。
952デフォルトの名無しさん:2006/01/08(日) 08:04:00
あ、駄目だ。
7が間違い。
全桁に対して配列をすべてなぞる形で組まなきゃ駄目だ。

あー、でもとりあえず>>951組んでアレンジすればなんとかなるべ。
953デフォルトの名無しさん:2006/01/08(日) 12:02:51
質問です。今GMPライブラリを使ったエルガマル暗号のプログラムを作っているんですが、512ビットのランダムな素数pをどうやったら生成できるのか分かりません。どなたか教えてもらえないでしょうか。
954デフォルトの名無しさん:2006/01/08(日) 12:08:30
>>953
そのサイズだと、適当に乱数作って確率的素数判定法使うしかないんじゃね?
例えばこれとか
ttp://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A7%E3%83%AB%E3%83%9E%E3%83%BC%E3%81%AE%E5%B0%8F%E5%AE%9A%E7%90%86#.E3.83.95.E3.82.A7.E3.83.AB.E3.83.9E.E3.83.BC.E3.83.86.E3.82.B9.E3.83.88

まぁ俺もよく分からんので例えばだが、OpenSSLの実装でも見てみたらいいんじゃまいか?
955SOS:2006/01/08(日) 17:47:23
main(){
int i,price[3];
price[0]=400;
price[1]=500;
price[2]=300;
for(i=0;i<3;i++){
printf("%d\n",price[i]);
}
}
上記の合計金額を算出するように修正せよ(forループを用いる事)
とあるのですが、どのようにとけばいいか教えてください!
956デフォルトの名無しさん:2006/01/08(日) 17:49:35
宿題は宿題スレへ
957デフォルトの名無しさん:2006/01/08(日) 17:50:23
VC6で gettimeofday はどこに入ってるのでしょうか?
958SOS:2006/01/08(日) 17:58:39
宿題スレに書いたんですが、なかなか返事が来ないので
お願いします!あさってテストなもんで・・・・
959デフォルトの名無しさん:2006/01/08(日) 17:59:50
>>957
Win32プログラミングのスレに移動してください
960デフォルトの名無しさん:2006/01/08(日) 18:01:47
>>958
堂々とマルチ宣言か
氏ね
961デフォルトの名無しさん:2006/01/08(日) 18:05:36
1万桁の数同士の掛け算ってどうやればいいんでしょうか?
962デフォルトの名無しさん:2006/01/08(日) 18:12:12
>>961
多倍長計算のライブラリでも拾ってきて計算
963デフォルトの名無しさん:2006/01/08(日) 18:13:01
>>955
printfの中のを++price[i]にしてみ
964デフォルトの名無しさん:2006/01/08(日) 18:13:38
しかし最近のCの入門書、殆ど

main()
{

}

なんだよな。仮引数にvoidを明示することもなければmainがint型を返すことを明示することもない。
warningが気になるならvoid main()とせよとか書いてあるしな。
965デフォルトの名無しさん:2006/01/08(日) 18:21:49
そんな事書いてる本なんて見たことないな
966デフォルトの名無しさん:2006/01/08(日) 18:26:15
>>962
そこを自力で。
967デフォルトの名無しさん:2006/01/08(日) 18:27:42
>>966
自力でライブラリ書けよ
968デフォルトの名無しさん:2006/01/08(日) 18:29:47
>>964
お前のような本末転倒型の「変なマニア」を作らないためだよ
969デフォルトの名無しさん:2006/01/08(日) 18:31:45
>>965
マジか。

近所の書店の入門本(しかないけど)全部それだった。
うち一冊でvoid main()にしろとか書いてあった。
970デフォルトの名無しさん:2006/01/08(日) 21:17:50
>>969
俺は面倒だとvoid main() って書くぜ
971デフォルトの名無しさん:2006/01/08(日) 21:39:35
intのどこが面倒なんだ?
972デフォルトの名無しさん:2006/01/08(日) 21:40:14
int<void
973デフォルトの名無しさん:2006/01/08(日) 21:45:47
return書かなきゃいけないのが面倒なんじゃないか?
974デフォルトの名無しさん:2006/01/08(日) 21:52:59
さすがに、そんなくだらない理由ではないと思いたいが。
975デフォルトの名無しさん:2006/01/08(日) 21:53:12
次の方次スレ立ててください

まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は専門の別スレッドがあるのでそこへさようなら。

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

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

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
C言語なら俺に聞け! Part 119
http://pc8.2ch.net/test/read.cgi/tech/1135077848/
976デフォルトの名無しさん:2006/01/08(日) 21:56:33
こんな中途半端なスレいらないだろ。
977デフォルトの名無しさん:2006/01/08(日) 21:58:10
またお前かw
978976:2006/01/08(日) 22:01:34
またと言われても・・・初めて書いたけど、
C,C++スレと何が違うの?
環境依存の有無だけ?
むこうはどっちでもおkなら、わざわざ分ける必要ないやん。
979デフォルトの名無しさん:2006/01/08(日) 22:03:37
>>978
どのスレと比べてんだ?
980デフォルトの名無しさん:2006/01/08(日) 22:04:34
981デフォルトの名無しさん:2006/01/08(日) 22:06:15
>どのスレと比べてんだ?
なんて聞き返さないといけないほど乱立してるのは問題だよな
982デフォルトの名無しさん:2006/01/08(日) 22:07:24
返却値の型を省略した場合は int を指定したものと見なす
int を返す main 関数の終端に達した場合、0 を返す
このことを意図して書いているコードにそれ以上文句たれても話がかみ合うことはない
983デフォルトの名無しさん:2006/01/08(日) 22:08:24
>>980
ツブすならそっちのスレだな。
984デフォルトの名無しさん:2006/01/08(日) 22:12:21
丸投げと環境依存に、スレ違いや誘導のレスばかりのこのスレに何の価値が・・・
985デフォルトの名無しさん:2006/01/08(日) 22:13:25
一応CとC++は別の言語なんだから本来CとC++は別のスレにするほうがいいと俺は思う。

俺はC/C++スレとこことは棲み分けができていると思う。
向こうには初心者歓迎というスレタイに初心者が集まってきている。
そりゃたしかにここにはスレ違いなのが紛れ込んできて、
スレ違いだと追い返すのはしょっちゅうだけどさ。

あと、ここが要らなくてC/C++スレで十分というが、
なぜC++相談室ではそんなことを言い出さないのかがわからない。
C++相談室も昼頃に新スレが立ち、1000を向かえたばかりという絶好のタイミングだったのに。
986デフォルトの名無しさん:2006/01/08(日) 22:18:07
>>982
確かにそうなんだが、全く解説無しって言うのはちょっと気になる。
void mainは勘弁
987デフォルトの名無しさん:2006/01/08(日) 22:18:17
いまどきCに限った質問なんて宿題以外になにがある?

こっちのスレの話題はC++相談室に含まれるが、
C++相談室の話題はこっちのスレには含まれない。
合併するならこっちが吸収されるのがスジだろう。
988デフォルトの名無しさん:2006/01/08(日) 22:18:54
流れをぶった切って済まんが、立てた。
C言語なら俺に聞け! Part 120
http://pc8.2ch.net/test/read.cgi/tech/1136726279/
989デフォルトの名無しさん:2006/01/08(日) 22:20:23
>>985
環境依存の質問をいちいち追い返したり、気まぐれで誰かが回答するくらいなら、
それを受け入れてる向こうのスレの方が価値が有る。
990デフォルトの名無しさん:2006/01/08(日) 22:21:22
>>987
それはあなた個人がこのスレの記事についていけてないだけだ
現に、丸投げでも環境依存でもない C の話がちゃんとできている
991デフォルトの名無しさん:2006/01/08(日) 22:23:27
>>986
解説をするなら、何の章でやるべきだと思うんだ?
俺は特定の処理系に依存する要素(コマンドラインなど)の章だと思うが
992デフォルトの名無しさん:2006/01/08(日) 22:33:44
>>989
俺的には多少の環境依存は可だと認識しているけどな
環境依存と丸投げの多くが同時に来るんだよ
論点をはっきりさせようとしていないと、どちらも起こりやすくなるからな

ただ、「その環境」を使っていない人を閉め出す形が長く続くようなら
各人の良識で回避(=移動)しようやってのがわからないかい?
993デフォルトの名無しさん:2006/01/08(日) 22:47:33
>>974
いや、まさにその下らない理由
994デフォルトの名無しさん:2006/01/08(日) 22:49:46
>>982
これも承知でvoidと書くことがあるんだ
995デフォルトの名無しさん:2006/01/08(日) 22:54:28
馬鹿ですね。
996デフォルトの名無しさん:2006/01/08(日) 22:55:33
そうして関数の返却値を使いこなせない自称中級者が増えていくんだな
997デフォルトの名無しさん:2006/01/08(日) 22:57:18
>>994
>>964 からの流れだよ?
998デフォルトの名無しさん:2006/01/08(日) 23:01:07
998
999999:2006/01/08(日) 23:02:02
しー言語なら俺にきけ!!!!
1000デフォルトの名無しさん:2006/01/08(日) 23:02:08
>>988
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。