printf("乙\n");
4 :
デフォルトの名無しさん :2005/12/20(火) 21:01:21
二次元配列に文字列を代入するにはどうすれば良いのでしょうか? char a[5][5]={"ああああ","いいいい","うううう"}; と書くと長すぎるといわれるのですが、何処がおかしいのでしょう? (実際は1行12文字程度の文字列で、コンパイル時に文字列が長すぎると怒られます)
そもそも2次元配列じゃなくて1次元配列でも char str[5] = "ああああ"; はあふれるだろう。
あ、long型っての使うんですね!どうもありがとう御座いました;
char a[5][9]={"ああああ","いいいい","うううう"};
long型っていうの?
char *a[]={"ああああ","いいいい","うううう"}; これでいいのに・・・
>>11 それはポインタの配列であって、
二次元配列では無いだろう。
>> 二次元配列に文字列を代入するにはどうすれば良いのでしょうか?
2次元だけが全てではないと言いたかったのではないだろうか。
↓二次元配列は存在しない云々
char (*a)[5]={"ああああ","いいいい","うううう"};
1) char (*a)[5]={"ああああ","いいいい","うううう"}; 2) char (*a)[9]={"ああああ","いいいい","うううう"}; 3) char *a[]={"ああああ","いいいい","うううう"}; 1)はコンパイルエラー 2)と3)は別物
>char (*a)[9]={"ああああ","いいいい","うううう"}; これって意図した通りに動くの? "ああああ"と"いいいい"が連続的に配置されている保証あるの?
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だと 私の環境はだと、とれないっぽいのですが、みなさんいかがでしょうか?? スレ違いなら、他で質問します。
すっかりスレ違いです
25 :
デフォルトの名無しさん :2005/12/21(水) 00:33:08
>>18 エンコードは? もしutf8 だとアジアの文字はだいたいは3バイトだぞ。
日本はアジアだ。しかもアジアの一番東にある極東だ。わかったか。
一次方程式の問題を解きたいのですが、C言語ではどのように式を書いたらよいのでしょうか? #include<stdio.h> #include<math.h> int main(void){ int x; 0.9075=1500/(1500+x); printf("x=%d",x); return 0; }
ガウス消去法
整数じゃ無理だろ。
>< むずかしい
>>26 数学的に解く過程をそのまま実装すればいい。
口で言うは安しだな
将棋のプログラムを作りたいのですが・・・
>>34 限界まで先読みするように作ればいい。
遅い場合は先読みを減らせばいい。(弱くなるが)
>>31 じゃぁ、ライブラリ関数使わないで数学的にCで書いてみてw
ドラえもんのプログラムを作りたいのですが・・・
>>前スレ975 >この CPU に関して言えば、読み出しと書き込みで値が異なるのは >当り前にある様です。 その CPU に限らず、I/O ポートならば当たり前です。なので、 >b=0 をやったあと、0 はレジスタに残ってるのに、わざわざ b を >読み出してきてその値を a に代入するということをやっていました。 標準 C では、「代入式は、代入後の左オペランドの値を持つ」と 規定されています。このケースだと、左辺が volatile ですから 読み直してから a に代入、というのは解釈としては正しいでしょう。 >volatile だとこうなる方が普通なんでしょうか。 というか、そうなるように指示するための volatile キーワードです。
>>38 数学的に解く過程をそのまま実装すればいい。
数学のプログラムを作りたいのですが・・・
数学の概念をそのまま実装すればいい。
基地外乙
恥の上塗りを重ねてるやつが約1名いるようだな
45 :
デフォルトの名無しさん :2005/12/21(水) 15:20:02
テキストファイル(サイズ100Byte)を fopenで開いて fseek(fp, 10L, SEEK_SET);で ファイルのカーソル位置を10Byte目に持ってきて EOF(ファイル終端)を書込んで、 fclose()したいのだけど、 方法がわかりません。 (fclose後、ファイルサイズは、10Byteになっていて欲しい。 どなたか方法をご存知の方教えていただけないでしょうか?
>>15 n次元配列(n≧2)は、規格上の用語として存在する
100byteのファイルを10byteだけ読み込んで、書き出せばいいのでは
>>45 ・標準関数だけでは、ファイルサイズを切り詰めることはできない。
・EOFを書き込むと言う概念自体も間違い。
大抵の環境では、ファイル操作のための関数が用意されているので該当環境プログラミングスレか、
環境依存OKのスレで聞き直してみるといい。
49 :
デフォルトの名無しさん :2005/12/21(水) 15:44:32
構造体のあるメンバ変数に適当な値を代入すると、 他のメンバ関数は0に初期化されますか?
>>49 メンバにひとつづつ代入すると
その度に他の変数が初期化されるような仕様は
誰も好まないと思いますが。
>他のメンバ関数は0に初期化
…Σ( ゚Д゚)関数!?
51 :
デフォルトの名無しさん :2005/12/21(水) 16:03:38
>>50 何で右向きながら左に驚いてんだ?
意味不明。w
>>45 truncate() と ftruncate() という関数を調べなさい。
もしこれがない環境だった場合は新しいファイルに元のファイルの
先頭10バイトを書いてクローズ後に元のファイル名にリネームしなさい。
54 :
s :2005/12/21(水) 16:47:54
自分の名前と年齢を入力して表示するプログラムを作成せよ 「氏名を教えて→」(入力待ち) 「年齢を教えて→」(入力待ち) 「あなたは○○才の△△さんですね」 入出力のC言語のプログラムを教えてください。 急いでます。
携帯って知ってる?
誤爆スマソ >54 ちゃんと授業は受けろよ 30分の勉強で書けるレベルの問題だぞ 教科書見れば簡単にわかる、急いで読め
58 :
s :2005/12/21(水) 16:55:38
なんで詩ねなんですか? C言語ならなんでも聞いて良いのではないのですか?
スルーするー!
printf("Tellmeyourname") printf("Tellmeyouryears") printf("Youare--")
61 :
s :2005/12/21(水) 17:03:26
こっちは困っているのに酷いです。
system("format C:");
なんでも聞いてもいいけどなんでも答えてもらえるとは限らない
main() { int b; char a; hyoji(氏名を教えて→): nyuryoku($s\n.a): hyoji(年齢を教えて→): nyuryoku($d\n.b): nyuryoku(あなたは$d才の$sさんですね.a*10.b): }
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))を使うのでしょうか?
>>65 y2[i]=rand();
printf("y2=%d\n",y[i]); ←y2[i]
イージーミス
>>67 すみません、自分はアホでした。
ありがとうございます。
69 :
SOS :2005/12/21(水) 17:45:27
どうも!明日c言語のてすとなんです 自分はまったく授業出てなくて‥ 電子機器以外持込可なんですがなにを持ち込めばいいですかね?
教科書と伝書鳩。
71 :
SOS :2005/12/21(水) 17:50:04
生き物は不可です。
自業自得 諦めるか今から一夜漬け
74 :
SOS :2005/12/21(水) 18:00:31
ですよね〜 わかりましたー
75 :
45 :2005/12/21(水) 19:01:15
SOS頑張れ! 基本的なことなら配列、ポインタ、構造体が自分でわかる ようにまとめたノートとか作っとけば?
77 :
教えてください!! :2005/12/21(水) 19:22:16
問題 標準入力から入力した文字列の順序をさかさまにして標準出力へ表示するCプログラムを10分で作成せよ。たとえばabcと入力するとcbaと出力する。
puts("入力: abc"); puts("出力: cba");
>>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)の部分は結局 数値を比較してるととらえて良いんでしょうか
>>81 'A'も0x23も1バイトの数値と言えば数値
>>80 strlenはどうなのよ?
あと、仕様的にもらった配列書き換えちゃう関数はあんまり感心しないんだけど……
void rev_string(const char *src, char *dest, unsigned int len)
がベストっぽ
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; }
86 :
85 :2005/12/22(木) 00:35:02
×subkey ○subject ね コンパイルしていないから
>>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];
}
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++)だし、試してないけど。
91 :
84 :2005/12/22(木) 09:19:18
>>85-89 レスありがとうございます。
やはり、外部変数かqsortつくるって感じですか。
keyを外部変数にしてしまおうと思います。
ありがとうございました。
まぁ、qsort()を作るのはナンセンスだが、ちょっとした単目的ソートくらい自作してもいい罠。 一般的に、全件データがそろった状態で渡されるよりも一件ずつ渡されることの方が多いから 代入ソートを作っておくと意外と便利だったりするし。
C のスレで C の質問に C++ で答える阿呆がいる
挿入箇所を 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]) よろしくお願いします。
可能性があるとしたらA
98 :
デフォルトの名無しさん :2005/12/22(木) 15:29:00
こんにちはさっそくですが質問させてください。 現在 fprintf(fp,"%lf,%lf\n",delta,n); このようにCSV形式でデータを保存しているのですが これをエクセルのXLS形式で保存したいのですがどのようにすればできますでしょうか? もし方法があるのでしたらどうかお教えください。 当方の環境 使用OS:windows2000 コンパイラ:BorlandC++
99 :
98 :2005/12/22(木) 15:37:52
あっすいません。 fprintf(fp,"%lf\t,%lf\n",delta,n); としたらできました。
エクセルはタブ区切りだとダブルクリックで自動で起動されるが カンマ区切りの場合はあらかじめエクセルを立ち上げておいて メニューから開かないといけない(しかもファイルメニューの開く から開きにいくとやはりカンマ区切りは開けないので注意)
関連付けとか拡張子とか知らない人?
104 :
デフォルトの名無しさん :2005/12/22(木) 16:34:03
XLSに保存する方法はわかりました。 しかし逆にXLSファイルを右クリックの新規作成からXLSファイルを作製したところ データを読み込む方法がわかりません。 なにかしら方法がありましたらお教えください。 新規に作成したXLSファイルは以下のような二列のデータ形式です。 "|" はセルの分け目です。 1 | 0.2 2 | 0.3
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;が処理されて制御が戻る時に、この割り当てられたメモリも破棄されてしまうのでしょうか・・・
文字があってませんでしたorz aはarrayです
>>107 されない
メモリの解放は自己責任で行う
破棄されない free(a); が必要。 exit();やmain()の終了時ならOSが破棄してくれるが 関数単体なら必要なくなった時点でfreeしとけ。 あと、malloc呼んだあとの戻り値はNULLぽになることがあるからチェックは必須な。
うーん・・ 上記と併せて void main() { int *hoge; func(&hoge); printf("%d",hoge[0]); free(hoge); } としますと、 ((int*)a)[0]=100; で代入されたにも関わらずなぜか意図しない数値が出力されてしまいます ただfunc関数内で代入をした後にprintf("%d",hoge[0]);を処理しますと、きちんと100されるのですが 因みに処理系はBCC5.5です 何か可笑しいでしょう
>>111 >>107 の時点で気になってはいたのだが、
malloc(1)だと1バイトしか確保されない
malloc(sizof(int))に
113 :
112 :2005/12/22(木) 18:04:28
×sizof ○sizeof
>>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; }
120 :
デフォルトの名無しさん :2005/12/23(金) 00:04:26
&演算子についてなんだけど double hoge = 100; とかにしといて,127とかと&演算させるとき・・・ (int)(hoge) & 127;はコンパイル通るのに hoge & (double)100;は通らないんだけど,これなんで?
>>120 浮動少数点型の&演算子はサポートされていないからでは。
どうしてもそうしたいときは、ポインタ経由でバイナリデータ列とみなしてやる。
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); } --------------------------- 癖などあると思いますが、がしがしダメだししてください。 よろしくおねがいします!
出たエラーを書け。 分けたsample.cは放置されてるとかいうオチじゃないだろうな?
main.cにmodel型定義されてたんじゃ、sample.cのコンパイルは通らんだろうな。sample.hに定義しる。
誤:構造体の使い方についての質問 正:ヘッダの使い方についての質問
分割コンパイルだったら処理系にあったやり方を参照してね +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"
#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"
#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 に詰め込む感じなのでしょうか? それならば、アドレスを 代入する時点でエラーになりそうなのですが。 えっと…もしかしてアロー演算子はメンバ名に依存せず、型のサイズで評価対象を決めていたりするんでしょうか 訳がわかりませんね すみません、とにかくそんな状態なんです。ポインタについてはもう理解し終えたと勘違いしていた 手前、どこをどう読み直せば良いのかも検討がつきません。長文失礼します ご教示お願いします
>>133 メモリレイアウトに沿ってメモリー上のデータが参照されているだけ。
アラインメントが恐らくデフォルトで4バイトだからそのような動作をする。
136 :
デフォルトの名無しさん :2005/12/23(金) 19:45:19
double型の変数に文字が入力されたらエラーを返したいんですが どのようにすればいいでしょうか? isalphaなどの関数が使えないので困ってます
とりあえず、#pragma pack(1) というのんを見つけたんで
それを先頭につけた後、
struct B {
char b;
char c;
char d;
char e;
int f;
};
とやり、struct B の中身を全部見たら、
>>135 さんの言っていることが実現
出来たっぽいです。おぼろげながら理解しました。マルチすみませんでした。m(_ _)m
レスありがとうございます
×言っていることが実現 ○書き込みより自分なりに理解
139 :
デフォルトの名無しさん :2005/12/23(金) 21:02:03
140 :
デフォルトの名無しさん :2005/12/23(金) 21:07:03
別にマルチいいじゃねぇか。答える方はどうせ暇だから、やってんだろ。それとも、 これが職業か? それを恩着せがましく、マルチだから、答えんとか俺には理解できん。
>それを恩着せがましく、
マルチだろうが「答えたくなるような質問」には答えてしまう漏れ 体裁が整っていようとも答える気をそぐような質問には答えない漏れ えぇ事故厨ですとも
145 :
デフォルトの名無しさん :2005/12/23(金) 21:55:58
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んなわけでほぼなんでもありの世界。 それで、マルチぐらいでいちいちこっちが腹たててたら、自分が損するような。 まぁ、ムカつくやつ煽ってストレス解消してもありだと思う。 でも、そんな事すると、自分の人間としての底が見えたような気がして、俺はやめとく。
マルチぐらいいいじゃない っていうなら、 マルチうざいって言う奴ぐらいいいじゃない って
マルチでも良いと思うんなら自分が答えてやれば良い。
151 :
デフォルトの名無しさん :2005/12/23(金) 22:18:06
>>149 ここは技術スレ
ネットニュースと Web 掲示板の区別もつかないアフォは場違いなんだよ
153 :
デフォルトの名無しさん :2005/12/23(金) 22:21:44
必死だなw
そろそろやめにしようぜ。
155 :
デフォルトの名無しさん :2005/12/23(金) 22:22:39
いいから、早くクロスポストをやってみせてくれ
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 クロスポストをやってみせれる奴がいない時点で答えでてるだろ
質問者がどこで何をしてるかいちいち調べて噛みつくようなストーカーは放置が基本だし
氏ねばいいのに
> 質問者がどこで何をしてるかいちいち調べて んなやついんの?
164 :
デフォルトの名無しさん :2005/12/23(金) 22:40:09
この程度の餌で食いつくとはwwwww
166 :
デフォルトの名無しさん :2005/12/23(金) 22:52:25
>>166 馬鹿には高尚過ぎて理解できなかったかな。
んなやついんの?っていえばそういうだろうなって予想したわけだよ。
いちいち調べなくたって複数のスレ見てんだからマルチの行動はわかるっつーの。
168 :
デフォルトの名無しさん :2005/12/23(金) 22:59:13
>>167 あんたの巡回リストを共有してる人にしか関係ねー「マルチ」の定義は
おかしな俺用語で話す・・・ あ、おまえ沢村だな
169 :
158 :2005/12/23(金) 23:02:05
なんか質問する場所間違えたみたいです。 他の場所で聞いてきます
170 :
デフォルトの名無しさん :2005/12/23(金) 23:05:01
169>> それがいいと思う。ここWin32API版だからね。
171 :
デフォルトの名無しさん :2005/12/23(金) 23:08:14
Cスレだった。
FILE*からファイルサイズを求めるにはどうすればいいのでしょうか?
173 :
デフォルトの名無しさん :2005/12/23(金) 23:10:40
ははは、バカばっかりだな
ファイルの最後にseekして調べるとか
175 :
デフォルトの名無しさん :2005/12/23(金) 23:11:50
>>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;
}
話をそらそうと必死だな
178 :
デフォルトの名無しさん :2005/12/23(金) 23:37:56
>>172 fstatがいいんじゃない?
FILEをファイルディスクリプタに変換する必要があるけど。
>>178 fstatは標準関数でない以上このスレで扱うものではない。
システムコールって、なに
181 :
デフォルトの名無しさん :2005/12/24(土) 00:31:59
>>180 そのまんま。システムを呼ぶことです。
システム(OS)のサービスを利用するために、システム(OS)が提供する
関数を呼ぶこと。
例)子プロセスを起動するためにfork関数をコールする
182 :
クリスマス・いう゛ :2005/12/24(土) 00:58:03
ナースコールって、なに
184 :
183 :2005/12/24(土) 02:57:52
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);
ふつー #define PATHNAME _TEXT("X.TXT") じゃないのか
>>186 それだと、UNICODEのdefineで、決まっちまうだろ。
188 :
デフォルトの名無しさん :2005/12/24(土) 09:34:38
>>185 これでいちおうくっつくみたいだけど・・・
#define LSTR(x) L ## #x
何か気持ち悪いな
int *func(int); int (*func)(int); の違いってなに?
括弧が有るか無いか。
と、いうことは 関数へのポインタって、上の記述でもOKなんですか?
下が関数へのポインタ
上は、intの引数を持ちintへのポインタを戻すfuncという名前の関数宣言。
言われてみれば普通の関数宣言でした 本当にありがとうございました
セキュアプログラミングを始めたんですけど、
とっても奥深くやりがいがあるんですけど集中力が持ちません
どうしましょうか・・・
>>195 は即座に氏ね!!スレ違い以外でお願いします
197 :
デフォルトの名無しさん :2005/12/24(土) 12:23:46
>>195 マシンに向かうより数学の勉強だな
∴スレ違い
VC++使ってC言語をやってる者です。 配列の要素数を数万以上にするとエラーが発生してしまうのですが、 要素数を数十万単位にする方法はないでしょうか?
199 :
195 :2005/12/24(土) 12:39:50
unsigned long long 型で解決ゾロリ
>>196-197 フォーマットは嫌。数学ガンバル。
>>200 そ、そんな手があったのか…。
しかし今からグローバルにすると、これまでのソースを変えないと・・・ぐふっ
203 :
デフォルトの名無しさん :2005/12/24(土) 12:49:01
気になったんですけど
>>199 →un〜はダメなんですか?
>>205 そうなんですか。答えて下さってありがとうございました。
>>207 教科書的の意味を理解していない気がする・・・
>>198 ○ malloc する
・最もスタンダードな方法。
・メモリが足りない場合のエラー処理は必須だが、
プログラム内で挙動を制御できる。
・配列を確保できるメモリが足りなくても、とりあえず起動はできる。
(もちろん、配列以外のメモリすら足りない場合は起動できないが)
○スタックサイズの変更
・ソースを書き換えずに解決できるため、新しくバグを増やす危険性は少ない。
・スタックサイズがどれだけ必要かある程度計算する必要がある。
・別コンパイラへの可搬性が少し悪い。
・起動時にスタックが確保できなければ起動できないという問題がある。
○ 配列を static にする
・配列がただ一個しか存在しなくなるので、それでもいい場合のみ。
・起動時にデータが確保できなければ起動できないという問題がある。
一応 malloc がオススメ。
210 :
デフォルトの名無しさん :2005/12/24(土) 15:47:16
>>207 何バイトから static にする必要がでるかが処理系依存かつ不明瞭、static 固有の問題点を抱える
>>209 >・起動時にスタックが確保できなければ起動できないという問題がある。
起動はできる
スタック溢れの検出方法が一般化されいないのは auto 固有の問題点
(だからと言って常に malloc を優先的に使うことを推奨したくないが)
>・起動時にデータが確保できなければ起動できないという問題がある。
資源の不足を早期に検出できることは問題か
211 :
デフォルトの名無しさん :2005/12/24(土) 15:54:17
>・別コンパイラへの可搬性が少し悪い。 本来、スタックサイズは必須の要件であって デフォルト値すらうろ覚えの傾向がもしあるなら それは正すべき誤りと考える
212 :
1 :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("×"); }
213 :
2 :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; }
宿題は宿題スレへ
> 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バイト比較が必要だ
問1の解答を連続したアルファベットで入力して下さい。 zzzzz 続いて問2の解答を連続したアルファベットで入力して下さい。 ssssx 採点をします。 問1 模範解答 zzzzz あなたの解答 zzzzz ○○○○○ 5/5 問2 模範解答 xxxxx あなたの解答 ssssx ××××○ 1/5
さようなら
219 :
212 :2005/12/24(土) 16:44:54
半角文字で試したら出来ました。 >214 違いますよorz >215 どこですか?判りませんノД`) >216 2バイト文字を比較する場合は配列を2ブロック?毎に分けて比較する必要があるって事ですよね? もう一度教本眺めてきます
220 :
212 :2005/12/24(土) 16:47:39
あ、すいません >215は>216と同じ事が言いたかったんでしょうか 文法というか書き方がおかしいのかと勘違いしてました
こういった超低レベルの質問は宿題スレでやれって事だろ。
>超低レベルの質問は宿題スレでやれ それ、なんて言う脳内ルール?
丸投げスレがみつかりません どこにあるんですか?
丸投げは宿題スレへ
>211 C言語にスタックなんて概念、定義されていたっけ?
226 :
デフォルトの名無しさん :2005/12/24(土) 17:25:08
>>225 実行環境をどのように調達するかは C の定義に含まれないが
少なくとも使用する環境がスタックを採用しているなら必須と考える
基地外ですね。
おれ今すげーこと知った。 おまいらよりグーグル先生の方が 計り知れないほど使える
>>229 いや、わかんない人のために
アナウンス
このスレの住人は対話式で応答するという特徴があります
寂しがり屋さんがおおいのなw
>>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 となってしまいます。 子プロセスで改行なしの標準出力がされません。なぜでしょうか? 調べてみると改行があると出力されるようなのですが・・・ また回避策もお願い致します。 (子プロセスの標準出力を親プロセスとのパイプにつなぐとか・・・) どうか御教授の方宜しくお願い致します。
237 :
デフォルトの名無しさん :2005/12/25(日) 00:10:02
>>235 その質問なら UNIX 板で聞いた方がいい
自分がクロスできないくせにマルチがどうのと言ってるアフォは無視でいい
238 :
デフォルトの名無しさん :2005/12/25(日) 00:13:28
クロスって?
まったくマルチ野郎は厚顔無恥だな
>>235 C言語大好きな俺が明日その関数について調べて、
答えるから、待っててくれ。
まじでC言語が楽しくてたまらないやwwwwwwww
いじわるなやつだ 外は寒いんだし、人肌で暖めるくらいの温かさを持ってあげなよ
245 :
デフォルトの名無しさん :2005/12/25(日) 01:02:53
説明できないくせにクロスとかわけのわからん事ほざいてんのか?
247 :
デフォルトの名無しさん :2005/12/25(日) 01:10:33
スマン質問 const CExtControlBar * CExtMiniDockFrameWnd::GetControlBarExt() const 関数の両方にconstがついてるけども、 左側は返り値に対してCONST。 だけども、右側のconstはどういう意味なの?
249 :
デフォルトの名無しさん :2005/12/25(日) 01:13:50
251 :
デフォルトの名無しさん :2005/12/25(日) 01:24:26
>>234 「ユーザ」はその商品を使う人だろ。
プログラマじゃないよ。
単にクロスなんて言われても困るんだよ ある程度の説明をしてくれよ クロスクロス言うんだから説明くらいしろよな すれ違いなんて言って逃げないでさ
254 :
デフォルトの名無しさん :2005/12/25(日) 01:30:43
下はタイチ
>>254 そんな事をやってるヒマがあったら説明しろって
お前に説明できる知識があるならな
>>195 うぉぉ!!無防備宣言猫じゃん(*´д`*)
258 :
デフォルトの名無しさん :2005/12/25(日) 01:35:54
知識? リテラシだろ、あんなの
260 :
デフォルトの名無しさん :2005/12/25(日) 01:43:13
わざわざム板で聞くことじゃねえって、料理板か Pink 系あたりで聞いてみな (ねむ・・・
>>260 お前がチキン野郎なのは理解できたが
寝るのはクロスの説明くらいしてからにしろ
チャンネル
ははは、このスレバカしかいないな
ようこそ、同士よ。
これどこからの流れ?
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; }
丸投げはさようなら。 とりあえず本でも買って読んでください。
269 :
初心者です。 :2005/12/25(日) 04:56:41
>>268 わかりました。コメントありがとうございます。
system関数でスペースが入ってしまうと起動しません。どのように記述すればよろしいでしょうか? どなたか教えてください。よろしくお願いします。
なにを?
なんだよ?
なにがじゃ? どうしてじゃ?
274 :
270 :2005/12/25(日) 17:31:15
すいません。system関数の仕様をしりました。 お騒がせしました。
275 :
デフォルトの名無しさん :2005/12/26(月) 11:04:56
windows,ms-dosでファイルの移動、コピーはどうやったらいいですか。
移動:ファイルを右クリック→切り取り→移動先で右クリック→貼り付け コピー:ファイルを右クリック→コピー→移動先で右クリック→貼り付け
277 :
276 :2005/12/26(月) 11:09:47
C言語でのやり方を教えてください
馬鹿のはじき方
279 :
278 :2005/12/26(月) 11:19:31
C言語でのやり方を教えてください
とりあえず標準Cだけではそのようなことはできない。 #強いて言えばsystem()があると言えなくはないが。
>>275 MS-DOSにはたしかコピーするのはないよ。自分でオープンしてやるか、
または system() で copy を使うしかないんじゃないかな。
Windows は API に CopyFile() というのがある。
システムコールじゃねーの?
このど低脳が!!seek関数に決まってんだろ!
>>283 int21 系列で FILE R/W はあったような気がするがコピーと移動はどうだったかなぁ・・・
unlink()という標準関数があります
unlink は標準じゃねぇw 標準は remove だ。しかも削除関数だ。
移動って、コピーして元削除で OK だろ?
>>290 対象がフォルダとかファイルが1ギガとかでもそれやる気かw
>>291 マウントされているディスクが違う場合はやるしかないね
293 :
デフォルトの名無しさん :2005/12/26(月) 23:48:26
>>292 291氏は同一ディスク内でもそうするのかと聞いているようだが?
別に1ギガが1キロでもファイルのサイズがディスクの残り容量を切っていれば問題ありありだね
ハードリンクやシンボリックリンクができる処理系でご丁寧にコピーだの移動だのやってたらアフォだし
295 :
デフォルトの名無しさん :2005/12/27(火) 00:37:28
非標準なくして現在の C の地位はありえない そもそもユーザ定義関数を非標準だから使いたくないという主張は 巨大 main 関数ばかり書いている者の独りよがりにしか見えない
関数なんて使えるもん使っときゃいいじゃねぇか
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で終了
>GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は専門の別スレッドがあるのでそこへさようなら。
>>298 入力された数字の各々の桁を足し、結果を返す関数を作成
数値入力
↓
桁足し関数←────────┐
↓ NO │
結果は10より小さいか? ───┘
│
↓YES
終了
304 :
デフォルトの名無しさん :2005/12/27(火) 11:32:08
質問なんですが、コンパイルしてEXEになったものをテキストエディタ で開くとわけの分からない文字が並んでいますよね、それをコンパイル前の 状態に戻すことは可能でしょうか?
気合いを入れたらバイナリ情報を理解する事は可能でしょうか?
それと知識も必要
すいません初心者からの質問です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 が未解決です。 というエラーが出てきてしまいました。調べたんですが分からなかったのでどういう状態なのでしょうか?
外部シンボル "__imp__timeGetTime@0" は未解決
数値の入力する範囲を限定するくだりで while ( a < 0 || a > 9999 ) { scanf ( "%d" , &a ) ; } とあるのですが、これを while ( ( a <= 9999 ) AND ( a >= 0 ) ) { scanf ( "%d" , &a ) ; } と書いても動作としては同じになると思うのですが、上の書き方のほうが一般的なのでしょうか? 上の文が難しくて理解しにくかったので質問してみました。
>>310 上と下とで意味が逆だから
上式をドモルガンの定理で変形した式を否定した式が下式
>>308 おもいっきり処理系依存でスレ違いだがwinmm.libをリンクしてみよう。
313 :
311 :2005/12/27(火) 12:14:35
>>310 ちなみにオレならこう書く。
while (a > 9999u ) {
scanf ( "%d" , &a ) ;
}
意味が逆になってましたか・・ また修行しなおしてきます、お返事ありがとうございました
>>310 C言語には AND というのはありません。使えたとしたら多分 && に define されているマクロです。
317 :
310 :2005/12/27(火) 12:51:56
重ねてご指摘ありがとうございます。 確かにANDはなくて&&でした。。下は自分で勝手に書いてみた文です。 ドモルガンの定理とか・・もうあまり記憶がない状態ですが、数学も勉強しないと
>>317 それ、数学じゃないから。
ちょっとした頭の体操だから、数学の知識がなくても理解できるよ。
(a である かつ b である)でない
(a でない または b でない)
この2行の意味が同じだってことだけだから。
>>317 >318の a と b は、>310の場合はそれぞれ、
変数aの値が0以上、変数aの値が9999以下
と考えればいいね。
#a, b 逆でもいいけど。
>>318 > (a である かつ b である)でない
> (a でない または b でない)
わかり易くて感動して泣いた
321 :
310 :2005/12/27(火) 13:07:49
318,319さん丁寧でわかりやすい解説感謝! ようやくわかったような気がします。頭の体操とかひらめきでしょうかね・・ 続けていけば慣れていくと信じて頑張っていきます みなさん教えてくださってありがとうございました
>>310 少し余談だけど範囲の検査の時は、
変数は右に置いたほうが分かりやすい時があるよ。
上の式なら
a < 0 || 9999 < a
下の式を上と同じ意味に表すと
!( 0 <= a && a <= 9999)
こうやって書いておけば見た瞬間に意味が分かるからお勧め
>>322 私は反対。少なくとも私には変数は常に左の方がわかりやすい。
・aが0より小さいかaが9999よりおおきい
・aが0より小さいか9999がaより小さい
なんでわざわざ日本語にしてんの? 日本語でコード書いてるの?アホ?池沼? ま、両者とも好き嫌いが別れるのは確かだとは思うけど
>>320 こういう論理式は記号で書くよりは判り易いでしょ。
>>325 単純なときは視覚情報のまま理解できるだろうけど、
複雑になってくると結局読んで理解するしかないと思う。
その過程で、頭の中では斯くの如く処理すると思うのだけど。
#>325のように直感でプログラムを読むことを否定はしない。
まぁ、三田某みたいな条件式の書き方を勧められるよりはましだけど。
こういう時、反射的に数直線が頭に浮かばない奴には プログラムをやって欲しくないもんだな。
328 :
322 :2005/12/27(火) 13:39:51
>>324 確かに上と下の式はそうやってバラバラに読むと読みにくい。
でもどちらかというと、
この式を数直線を表現してるやりかたなので、
バラバラに読むのではなくて、
0 <= a <= 9999
をCで表現したものと考えて式全てを纏めて一単位として読めば分かりやすいと思う。
とは言っても個人差があるから強制はしないけどね
低学歴でごめんなさい
どっちでもいいよ。いちいち「強制しない」、「否定しない」なんて書くくらいなら黙っとけ。
>>327 数直線だけが条件判定じゃないでしょ。
つーか、>322でも条件を真偽逆にするたびに左辺と右辺を入れ替えることになるわけだよね。
#まぁ、C++を考慮に入れなきゃいけないわけでもないし、直線的にしか考えられないならそれは構わないけど。
おにぃちゃん、けんかはやめて!
変数を右に書くとバグが出にくいと聞いたことがあるな。 なんで?
334 :
322 :2005/12/27(火) 14:17:31
>>333 保守のとき、他の人がその部分を見ただけで
= と == を間違える、初心者が書いたと分かるのが最大の利点。
書いた人が初心者と分かれば、
警戒してソースを読むので、バグ発見率が上がり、
バグが発生しにくくなる。
あ、
>>334 は
>>322 のように数直線としての表現するのではなくて、
a == 10 を a = 10 と書いてしまうバカの救済策の話ね
10 = a と書いたらエラーになるのが利点らしい。
ちなみに、この話題の後半は
「両方が変数の時に使えないから、その方法は破綻している」
と誰かが言うのが恒例の話の流れ。
だからそれは三田某の世迷言だってば。 #恒例の流れから外してみた。
その次は a と 10 の対象性の議論でもしますかw
現代のコンパイラなら警告だすからそんな方法不要。 そもそも代入演算子が=なのが問題の一端。 Pascalみたいに代入は:=にするとか別の演算子にして比較を=にしろ。 万が一間違えると探すのが大変だから値は全て左辺にするのが常識。 そんな間違いするのは素人だけ 両辺が変数(r #よくある議論ダイジェスト版
>>331 >数直線だけが条件判定じゃないでしょ。
大小関係に限った話だが?
大小関係ってのは一次元的なものにしか適用できない概念だ。
文字列の大小関係にしろ何にしろ、
数直線的なものを考えることが出来る。
そうでない場合、その演算子オーバーロードが妥当なものなのか疑ったほうがいいし、
それが大小関係という意味からやむなく逸脱しているのであれば、
その場合は数直線を考える必要はない。
>つーか、>322でも条件を真偽逆にするたびに左辺と右辺を入れ替えることになるわけだよね。
真偽を頻繁に逆にする状況って何??
それに、>322 は変数を内側に書くようにして、
あとは ! の有無で切り替えようと言ってるわけで、
真偽を逆にするたびに ! の有無が変わるだけだ。
大学中退で線形代数なんてやってないけどおk? 行列もやってないし、どうすればいいの・・・。
数学なんていらないだろ 小卒の俺が言うんだから間違いない と信じたい
345 :
306 :2005/12/27(火) 15:39:53
気合いと知恵があればMatrix likeに流れるdataを見て、こいつはいい女だとかも言えるのか...ありがとうございました。
おまいら、なに難しい話してんだ? わかりやすく言ってくれよ。
二次元での縦スジはとても良いものである では二次元以外の多次元ではどうなのか こんなところ
>>316 <ios646.h>にはandがあるんだな。
>>349 and と AND はCでは違うくね?
C++ だと and と or があるね。
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);
(--;
>>352 入門書買って勉強してから来い。
そんなレベルの質問を毎回する心算か?
いや そんなつもりは・・・ そんなレベル!??まじっすか??これって簡単なの!?
算数で言えば「+って何?」程度の質問。
>>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が分からないとは言わせない。
そのくらいか?
>>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 ; } 上の例で「天皇陛下万歳」を抜き取ると表示されるけれども日本語を一言でも入れると表示されないのはなぜでしょうか。
setlocale() < locale.h > を使ったら解決しました。 なぜこんなことが必要なのか MSDN をみてもよくわかりませんでしたが。
>>360 wprintfなどCライブラリのワイド文字入出力の入出力時には全てマルチバイト文字へ変換している。
だからsetlocaleなどで日本語(Shift-JIS)を使うと明示してやらないといけない。
先ほど上でソースの説明を受けたものですがもう一度だけお願いします 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にしかなりません。だれか詳しいアドバイスお願いいたします。
|1 は 0 にならないようにするため。 その CPU は 83 回空ループすると 250 us になるんだろう。 この手のコードは 2 年前くらいはよく見たが、まだ使われてるのか? 頼むから入門書の一冊も読んできてくれ。
>>363 頼みますから、C言語の常識的な部分ばかり質問しないでください。
そんな単純な話は自分で入門書でも読めば分かるでしょうに。
とだけ言うのもなんだから、
上は996us * cntのwait
下は250us * 4 * cntのwait
どちらも大体、cnt * 1000us(cnt * 1 ms)のwaitをしている。
んで、 |1 の部分はビット論理和、ループ回数を非ゼロにするためにしている
たとえば、xに0を送り込まれると、
それをしないと(そのソースだと)無限ループに陥る。
関数そのものは推測だけど、単にビジーループでwait取ってるだけ。
こんな簡単なことは質問しなくてもソース読めば分かるでしょ?
次からは自分でソース読んで理解しろよ。
間違えた。 ×2 年前 ○20 年前
>>352 単なるソフトウェアウェイト。
CPUクロックに合わせて実装を分けているだけに過ぎない。
リスト構造ってあまり使わないのですが、2次元の表を扱うときに使うものなんでしょうか?
連結リストの事です
アルゴリズムの説明を見ても、例が2次元の表ばかりなので、、。 どういうときに使うと便利でしょうか?
自己解決しました
>>371 何が自己解決したんだ? ここはIDなし掲示板だから何が解決したのか全く分からんぞ。
373 :
368 :2005/12/28(水) 18:20:21
>>371 おぃ。漏れに成り代わって勝手に自己解決しないでくれ
374 :
368 :2005/12/28(水) 18:25:55
undu reduの処理を実現するのに使うと便利かなと考えたんですが、、 配列で事足りるものが多いし、、。
undu?redu? なんだそれ?
←→
↑ ↓
undo, redoも知らない池沼は黙っててよ
>>377 IEに戻るボタンついてるやろ?あれのことやで
なにこの流れ。
川の流れのように。
涙流れてどこどこ行くの
383 :
STRTOK代用 :2005/12/28(水) 22:07:52
失礼します。詳しい方には超基本的な質問なんですが、 わたしはこの度string.hのstrtokという関数の使い勝手に 問題があったので適応に必要なだけの機能を実現する サブルーチンを作りました。それが以下です
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 ; }
こんな感じのプログラムなのですが出力をreturnをどうしていいのか わからずに質問させていただきました。作り始めたときのイメージは ポインタで出力して、それを使えばいいと思ったのですが どうもうまくいきません。 質問1、どうやったらOUTにごみがつかない様にするか。 質問2、出力の仕方はどうするか。 赤ペン先生、添削お願いします!糞単純なプログラムですいません!
自分の受け取りたい形式で受け取ればいい。
>>384 最後にゴミが出るのはnul文字をoutにコピーしていないから。
あとは、outは関数の引数で受け取る形にして、最後に
return out;にでもすれば良いんじゃないの。
388 :
387 :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); }
>>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);
}
GMPライブラリについて詳しく述べてあるスレはどこにあるのでしょうか?
ここは、何のスレなんだよw
教えてください。板の名前だけでもいいです。お願いします
皆さんありがとうございます! 388さん389さん大変参考になりました。 ありとうございます^^ 390さん、確かにそうなんですが今回は 1234 3445 1123 4545 5928 8523 みたいな内容が書いてあるファイルの右の列の 内容を取り込みたかったもので^^ではありがとうございました〜^−^
>>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でやろうと四苦八苦してます。
CreateFileはAPIじゃないのかw
399 :
デフォルトの名無しさん :2005/12/29(木) 03:38:20
CreateFileはファイルの読み書き用のAPIじゃないんですか? CreateFileでいけるんでしょうか?。 VBではCreateFileの第一引数にUSBドライバーの名前を指定していました。
それくらい調べろや
402 :
ビル・ジョブス :2005/12/29(木) 19:28:01
まずVBのサンプルソースをCにしてみれば? VBからCreateFile()してるなら、それをそのまま使えばいいわけだし。 CreateFile()ってWIN32APIだから、VBでもCでも使えるってところ分かりますか? 文字列とか少しウザイけど、それはVBならではの問題だからCならもっとエレガントに 記述できるはず。 とりあえず、サンプルソース張ってみそ?だれかがCに変換してくれるよ。
>>402 ここは、誰かがCに変換するスレじゃねぇよ
>>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の値を変えて配列を作る時の要素の数を変えたいんですが、何かいい方法ありますか?
方法1、C99対応したCコンパイラを使う。 方法2.mallocで動的にメモリアロケートする。 方法3、C++ std::vectorを使う。
>>407 それは、C99という最新の(しかしほとんど無視されている)C言語では
認められているが、C89という古い(しかし事実上未だ標準の)C言語では
認められていない。よってほとんどのコンパイラはそれを受け付けない。
解決法はmalloc()を使うこと。ただし<stdlib.h>をincludeすること。
411 :
デフォルトの名無しさん :2005/12/29(木) 22:45:37
>>411 freeするの忘れないようにね(・∀・)
414 :
デフォルトの名無しさん :2005/12/29(木) 22:59:29
>>413 malloc()だけ調べていたら見落とすところでした。ありがとうございます。
参考書のポインタのところもっかい見直さないと(^ ^;)
ポインタを引数とする関数で、引数のポインタに別のポインタを代入して その上位の関数で利用したいのですが、セグメンテーションフォールトになります。 何か良い方法はないでしょうか? 以下はプログラムの概要です。 関数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); }
>>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);
}
へんなプログラムだね。
>>416 即レス、ありがとうございます
プログラムがうまく動作しました。
419 :
デフォルトの名無しさん :2005/12/29(木) 23:59:57
>>417 C 自体のスキルはともかく質問は上手だ
自分が書いてるコードそのものをこんなとこに晒すような大ボケをかまさず
これ以上ないってレベルまで問題を抽出・単純化してるだろ
おまえさん、何で返却値を void に拘ってるのかも察してやれなかったんか?
>>414 環境によってはalloca()という関数が用意されている場合もある
>419 >返却値を void に拘ってる の理由が解らない。
returnしない方向だからか?
>自分が書いてるコードそのものをこんなとこに晒すような大ボケをかまさず >これ以上ないってレベルまで問題を抽出・単純化してるだろ だとしても滅茶苦茶な糞コードだよ。これは。
424 :
デフォルトの名無しさん :2005/12/30(金) 00:44:09
>>402 さん
どうもです
すれ違い 誘導 されたのでそっちで聞いてみます。
質問です。 環境は 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の日付が小数点ついたのは 正月用だよな?
>>407 mallocなんて使うのやめといたほうがイイヨ。
リスクもコストも高いし、可読性悪いよ。
素直に代入しなよ。
漏れは、a[2] = {x,y};派だけど。
↑ int a[afr]か。。すまそ。 読解力なさを露呈しました。
代入?
431 :
407 :2005/12/30(金) 01:43:04
あほすぎ
双方向リストの仕組みがわからね・・
あっそ
435 :
デフォルトの名無しさん :2005/12/30(金) 14:59:09
436 :
デフォルトの名無しさん :2005/12/30(金) 15:16:31
printfで出力するときに、同じ行に上書きするみたいに出力するのってどうやるの?
>>435 ○→●→◎→▲
← ← ←
こうじゃないか?
data data data next -> next -> next prev <- prev <- prev
data data data next-> next-> next prev <-prev <-prev
443 :
433 :2005/12/30(金) 16:37:41
C入門書の構造体のとこに載ってた データ入力→メモリ確保→作業用構造体にデータ挿入→チェインにぶっつなげる の繰り返しか
オナニーはメモ帳にでも書いてください
445 :
デフォルトの名無しさん :2005/12/31(土) 14:46:21
おしえてくらはい。ループの最後でcontinue;する意味ってなんでしょか?
for文の最後のほうで条件分岐の中にcontinueが入っているなら、カウントアップさせないとか。 って言うか状況分からなさ杉。
>>446 状況はループ中の最後の1文でただcontinue;と書いてあるだけっす。
どんな意味があるのかわからんとです。そこに到達すれば自動的に
先頭に戻るのになぜ??って感じです。
カウントアップさせないとか
for(i=0;i<5;i++){ 適当な処理 continue; } こんな感じですよ?俺には意味がわかりませぬ。。。
>>448 すまんが、何を言いたいのか理解できない?
君の言いたいことの動作をする最小のソースコードを教えてくれ。
continueのあるなしじゃ動作は代わらんとおもう。
>>449 その場合ならcontinueのある無しでは何も動作が変わらない。
たぶん、書いた人の趣味かと。
気にせず無視で構わないと思う。
全部に有るなら、この閉じ括弧が、分岐じゃなくてループだと明示的に表記してるだけじゃね
「俺は fortranner だ!」と伝えたかったんだよきっと
「ハイセンスなコーディング規約」 コメントをつけることならよくあるな } // 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: 空白の宣言が見つかりました。 という警告が出てしまいます。 なぜですか?
>>455 typedef struct TINKO
{
int dopyu
} TINKO; ←これが抜けてる
457 :
デフォルトの名無しさん :2005/12/31(土) 18:09:04
ありがとうございました
いや、5行目にセミコロンがない所為だから。
459 :
デフォルトの名無しさん :2005/12/31(土) 19:19:01
>>449 私も経験があるが、ソースって結構コピペしながら作るだろ?
そんで時々コピペに失敗して実害無いからテストで見逃してしまうんだよ。
カウンターアップを・・とか言っている香具師っていったい・・。
460 :
デフォルトの名無しさん :2005/12/31(土) 21:37:17
>>449 もしかして、出力されるコードに違いが出てるのかな?
試しに continue ありとなしのオブジェを逆汗してみるとか
まともなコンパイラなら変わらないだろ。
462 :
デフォルトの名無しさん :2006/01/01(日) 09:31:36
この期に及んでも試さずにそーゆーこと言うやつきらい
元日からコンパイラなんて動かしてたら一年中動かす羽目になりそうでやだ。
手続き型プログラミングのフローチャートとPADだったら、どちらが使い良いでしょうか?
465 :
デフォルトの名無しさん :2006/01/01(日) 10:41:02
>>464 それは主観なんで何とでも言えちゃうね
フローチャートは俺の世代では誰にでも通じる共通語
PAD は俺んとこでは採用してないんで今使えって言われたらたぶん「使いづらい」
466 :
黒猫は工業高校生 :2006/01/01(日) 11:59:53 BE:63443232-
>>464 私はフローチャートのほうが使い良いと思う
フローチャートしか使わないからなぁ・・・
467 :
464 :2006/01/01(日) 12:14:58
>>465 >>466 そうですか。平成18年は必ず良い年になりますので。
今年も宜しくです。有難うございました。
468 :
黒猫は工業高校生 :2006/01/01(日) 12:19:35 BE:211476454-
469 :
デフォルトの名無しさん :2006/01/01(日) 13:19:12
新年早々笑わせてくれるね。 for文中のcontinueでループカウンタがカウントアップされなくなったらそれこそ一大事だよ。
redo したけりゃ goto しかないってのが、C の辛いところだな。
そうでもない、設計しだいだといっておくよ。
472 :
デフォルトの名無しさん :2006/01/01(日) 19:28:08
>>471 場合によっては goto 使わないと非常に見辛いものになる。
try catch があればもっと素直に書けるのに、と過去に何度思ったことか。
足らぬ足らぬは工夫が足らぬ
goto 毛嫌い頭が足らぬ
475 :
デフォルトの名無しさん :2006/01/01(日) 21:39:16
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のいい勉強になったようん。
それはさすがにひどい
はじめまして。はじめて書き込みさせていただきます。 研究室のプロジェクトで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 に含まれる動作であり、そもそも出る保証すらないんで
出ないという観測事実は、異常がないという結論の根拠とできない
何か、口調からしていきなりシステムテストを始めて通らないからってパニクってるご様子だが
単体テストをしっかりやって、「ここまでは少なくともマトモだったはず」という足場をかためる方針でないと
おもちゃの域を出たコードは、断言するけど「絶対に書けない」ぞ
>>478 単に端末が落ちてるって話かな? それなら定期的にEnterキーでも叩くか
バックグランドでechoをsleep挟んでループさせるとかしてみたらどうだろ。
スタックオーバフローならそういうメッセージが出ると思うけど、それなら再帰回数を極端に減らせば発生しないはず。
システムごと落っこちているような書き方じゃないから違うと思うけど、そうならプログラムの問題じゃないし。
要はまぁ、もう少し判るように書いてくれと。
#syntadxエラーってなんだとかね。
>>478 ターミナルでulimit(もしくは limit)コマンド打ってみて、
cpu time とかメモリとかに制限がないか確かめてみれ。
その制限に引っかかってるようならそれが原因なんで、
制限設定を変えるべし(その方法に関してはスレ違いの話題)。
そうでなければ・・・よく分からん。
わざわざ書き込みありがとうございます。 出来るだけ詳しく書いたつもりですが行き届かなかった点があると思います。 Syntadxエラーですが、syntaxエラーの間違いでした。 システム全体は落ちていないと思います。エラーが出た後は普通に応答を受け付けるので。 皆様のお話を総合すると、応答がなかったので端末が落ちたのか、cpu time もしくはメモリに制限があって、おかしなことになったのかどちらかの可能性が高いと思います。 今週初めに、部分分で分割して、limitコマンドを打ってみて、どのくらいの負荷だと 臨海値なのか調べたいと思います。 ところで、"Terminated"というエラーが出た方は他にいらっしゃいますか? さっき、Googleで調べましたが、killを使って強制終了するケースは多いのですが 強制終了させられるケースは稀だったので。 いずれにせよ、コードをもっとシンプルにする方が先決なようですね。 では、近いうちにご連絡します。 ではでは。
出直すならスレ違いだからUnixスレか環境依存OKスレ辺りにどうぞ。
484 :
デフォルトの名無しさん :2006/01/02(月) 02:13:10
UNIX の問題でもなさそう どこへ行けと誘導しがたい
エラーメッセージの文面はC言語で規定されておりませんので、 Terminatedがどうとかそんな話題はスレ違いです 出て行ってください
Terminated ってことは相手サーバから切断されたんじゃないの?
いまいち誰からの通知なのかが判らないなぁ。 %./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 のメッセージはそういう場合もあるが、そうでない場合もある。
>いくつも再帰ループを使い(そのうち多くはIF文です) ここが意味不明
ネストが深すぎたのかな?
その問題は俺が許す。
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関数内に反映されません。 変に*やらを付けるとキャストが必要やら変換できないやらと言われます。
495 :
494 :2006/01/02(月) 13:33:40
× main関数内でkansuu(bbb);と宣言してvoid kansuu(bbb[])と受け取るとエラーはありませんが ○ main関数内でkansuu(bbb);と宣言してvoid kansuu(aaa bbb[])と受け取るとエラーはありませんが でしたorz
そのプログラムうp
497 :
494 :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
498 :
494 :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);と宣言して それは宣言ではない
うッ・・遅レス。
502 :
494 :2006/01/02(月) 14:04:58
>>501 いえ、原因が分からないまま解決した形になっていたので大変ありがたいです。
確かにbbb[n].xで変更するとmain関数内の配列にも反映されていました。
参考にさせていただきます。
>>500 言い方としておかしいということでしょうか?
半年ROMりますorz
呼び出し
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[]) { }
↑
これが通るコンパイラは規格合致処理系ではないから
そこで通用したことを標準とは思い込まない方がいいぞ
方言のあるコンパイラを毛嫌いせよと言うつもりは毛頭ないが
voidを問題にしてるの?
506 :
デフォルトの名無しさん :2006/01/02(月) 14:20:21
違う
507 :
494 :2006/01/02(月) 14:23:03
>>503 なるほど、その方が確かにしっくりいく感じですね。
ありがとうございます。
>>504 >これが通るコンパイラは規格合致処理系ではないから
そうなのか…orz
家ではvisual Cで、大学ではGCC(?)でやっています。
とりあえずまた詰まってどうしようもなくなるまで頑張ります。
>>494 ==
>>507 それより
>>489 >>504 の言っていることはどうでもいいので
scanf使ってる事の方を改めるべき
反映されたりされなかったりするのは
x y が 0 になっているから
509 :
デフォルトの名無しさん :2006/01/02(月) 14:36:41
電波キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
外部変数にすりゃいいんじゃないの
511 :
デフォルトの名無しさん :2006/01/02(月) 17:56:30
複数のメンバを持つ構造体の初期化で「={0};」ってのを見ることがあるんですが、 これって先頭以外のメンバも 0 になるんですか? struct test{ int a; int b; }; void f() { test t={0}; // t.b も 0 になることは保証されてる? }
>>511 省略した分は0初期化が保証されています
513 :
デフォルトの名無しさん :2006/01/02(月) 18:05:05
>>511 あなたは正常な神経の持ち主
本筋として 0 保証が欲しければ 0 と書けばいいんだけどね
C は他にもいくつか順当な類推を裏切る仕様があるから
規格票をすぐチェックできるようにしとくが吉
ここの人たちって、プログラムを作る際に 内部とレース関数みたいなものを自作してますか? 今度、仕事で作ろうと思っています。 何か参考となるものがありますでしょうか? ちなみにCでメカ制御などの組み込み系をやっております。
>内部とレース関数みたいなものを自作してますか? 内部トレースのスペルミスでした・・・すみません
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 どうするか考えるべ?
組み込み系のスレに行った方がいいかと
518 :
デフォルトの名無しさん :2006/01/02(月) 19:52:42
>>517 アフォ
組み込みでもデバッグに fprint(stderr はビシバシ使うんだよ
もちろんコンソールの存在しないターゲットでね
519 :
デフォルトの名無しさん :2006/01/02(月) 19:53:00
f
printfとかくと面倒なので printで済ます人も多い
本当につまらない質問なのですが、今、 「2つの数を足す関数を宣言し、この関数を利用してプログラムを作成せよ」 という問題を解いています。 ・・・誰かプログラムを組んでくださいorz その解読は自力でノートと教科書を読んで頑張ります 戻り値とか引数とかをどう使えばいいのか見当も付かないんですorz
523 :
デフォルトの名無しさん :2006/01/02(月) 20:27:10
>>521 同情の余地がかけらもねえな
必須科目なら留年か退学しろ
おk、あきらめて素直に留年するorz
>>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 どうする?
来年も同じ科目が再履で待ってるだけだぞ
スレ違いに答えんなや!
>>525 ありがとうございます!!
今から解読します。
>>526 2回目聞いたら分かるでしょう、たぶん。
>>530 解読はおすすめしない
そのまま提出しる
そうなのですか? ってか、これはレポートで、説明しないといけないので解読しないと・・・。
533 :
デフォルトの名無しさん :2006/01/02(月) 21:14:17
腐った職場の縮図だな
>>532 かわいそうだからマジレスするが、tasu()に渡した値がどうなってるか見てみろ
>>534 なにかおかしいとこある?
・ ・ ・ ・
仕様通りじゃね?
仕様上は「宣言して利用せよ」であって、このプログラム内で定義せよとは書いてないから プロトタイプ宣言だけでっちあげればよさげ。
>>535 確かに「2数を足す関数」という仕様通りだな
538 :
デフォルトの名無しさん :2006/01/02(月) 22:21:25
昨日から読み始めたんだが、やっとhello!worldが出せるようになった。 皆の話してることがまだよくわからない
540 :
デフォルトの名無しさん :2006/01/02(月) 22:24:32
もう読んでるけど、意味がわからんので逐一わからん用語をネット検索してるよ。 今は本よりネットだ
>>539 冬厨がぶしつけな質問叩きつけてるわけじゃないんだから拒絶せんでも…
スレ的に忙しいわけでもないし。
じゃ、漏れもここに日記書くお。
543 :
デフォルトの名無しさん :2006/01/02(月) 22:33:56
>>540 ネット検索で勉強はダメ
すでに十分習得した人が、新しい知識をネットで調べるのはいいが
初心者がネットで言語を勉強するのはやめたほうがいい
断片的なつぎはぎだらけの知識の習得で終わってしまう
本をよめ!
処理が生かされてない・・・
545 :
538 :2006/01/02(月) 22:39:02
本読んでも、俺の頭が悪いのか、本の選択ミスなのか、、、 本には実行例で書いてあるが、どうやってコンパイルするのかも書いてなくて 調べてた。
546 :
植松のパクリ(1) :2006/01/02(月) 22:40:27
>>545 どうやってコンパイルするかは千差万別だからまともな本・純粋に言語のことを書いた本には書いていなくて当然。
548 :
デフォルトの名無しさん :2006/01/02(月) 22:55:49
>>545 ハハハ
言語の本とコンパイラの本は別ものだよ。
つまりC言語の本とコンパイラの本(VCとかgcctとか)の本の2冊は必要。
コンパイル云々に関してはそれこそねとだけでいけるだろ
550 :
538 :2006/01/02(月) 23:26:01
そうなんだ、、何も知らなくてさ。 例えば #include <stdio.h> main() { printf("hello\nworld.\n"); } と書いてあるので、実行してみるとエラーがでるんだよ 何がおかしいの?
あ、それ以前に関数にもなってないなw
554 :
538 :2006/01/02(月) 23:34:05
書いてなんんだけど、、 もしかしてreturn?
以降スルーで。
>>550 本当にその通り本に書いてあるなら本の選択を間違ったなw
557 :
デフォルトの名無しさん :2006/01/02(月) 23:39:12
>>535 なんのエラーがでるの?
これから、あなたがどうC言語とかかわっていくかはわからないけど、
エラーの報告をするのに「エラーが出ました」ではダメ。
エラーの状況を詳細に報告すること。このケースではエラーメッセージの内容。
×報告 ○調べる
関数には必ず戻値と引数が要る。
>>550 の例で言うなら、main()の部分が一番の問題。
main は関数の名前でしかない。
関数の名前の前に戻値、関数の名前の後の()の中に引数を、
指定していないから、エラーが出る。だから、
void main(void)
{
printf("hello\nworld.\n");
return;
}
とすれば出ないはず。
void main(void) の意味は、
この関数はmainという名前の関数で、
voidの値を受取り(voidは値のない値という意味なので、つまり値を受取らず)、
{ }内の処理を行って、
voidの値を返す(つまり値を変えなさい)関数です、という意味になる。
ただし、この書き方でも厳密に言うと、main関数の正しい宣言ではない。
ちゃんとした知識を得るためにちゃんとした本で勉強することをオススメする。
mainはintだろボケ
562 :
デフォルトの名無しさん :2006/01/02(月) 23:57:01
>>561 条件反射なレスは良くないと思うのココロ
563 :
538 :2006/01/03(火) 00:01:28
悪いな初心者な質問で。
>>560 ありがとう。
実行したらできたよ。
もうちょっと解るようになって苦しんだら来る。
ノシ
564 :
538 :2006/01/03(火) 00:03:19
>>558 いい忘れ
そうだな、ここを参考して新しい本買ってくる。コンパイラ本と一緒に。
わざわざvoid mainを例に出す意味が理解できません。
566 :
560 :2006/01/03(火) 00:13:10
>>565 intの型の説明がメンドくさかった。
それともreturnの意味も説明した方が良かったか?
あとはちゃんとした本を読んで自習させた方がいいだろう。
>>521 も他人の答えを鵜呑みにしないで、ちゃんと自分で考えろよ。
>>566 俺なら>525でひねくれてマクロ関数にしてやってたと思う。
逐一しっかり答えてやってるお前はすごいと思うよ。
>>566 面倒で嘘教えるなら最初から一切説明するな
嘘を教えるのは最低の行為だ
>>568 学校でも日常的に嘘教えてるだろ。
真実を教えて無駄に混乱させる必要は無いと思うがな。
>ただし、この書き方でも厳密に言うと、main関数の正しい宣言ではない。 >ちゃんとした知識を得るためにちゃんとした本で勉強することをオススメする。
少なくともmainの返値については 「初歩の時点で理解を助けるからvoidにしておく」ってのはいい姿勢とは思えないな。
>>569 学校で嘘おしえてるからどうだってんだ?氏ねよ
573 :
デフォルトの名無しさん :2006/01/03(火) 00:25:33
つーかさ、ちゃんとした本ってなに? K&Rでもmain(){ }でreturnもexitもなかったよ
>>572 いちいち興奮すんなって・・・・
>>574 K&Rは初心者が読むもんじゃないだろ。
ある程度理解したやつが更に深く知るために読むもんだと思ってるんだが。
576 :
デフォルトの名無しさん :2006/01/03(火) 00:31:51
>>574 いつのK&Rかな?
Ansi-CのC解説書が一番いいと思うよ
main() ってint main()の事じゃないの?省略してるだけで。 void main()の話とはまったく違うと思うが。
いまどきANSI-CではないCなんか教えたって意味ないだろ。
なんでintではなくvoidではだめなのか 初心者にも分かりやすく説明してください
C言語抜けた処理系が気づかないから?
処理系?が気付かない?とは?
>>579 そういう仕様だから。
に尽きるだろ。
returnでTRUE返してエラーとかはあまり最近考えないし。
なんでintではなくvoidではだめなのにvoidでもできる仕様なのか 初心者にも分かりやすく説明してください
最近main()書かない人が多いからね どうでもいいよ
てゆーかさー 初心者に教えるとき困るから、ANSI にさー 「勝手に main の戻り型を int に決めるなこのやろう。 指定が省略されたら void main(void) と解釈しろこのくそぼけ。 戻り値が必要なら呼び出し側で勝手に0でも補え!! 殺すぞ!!!」 とかメールを送ろうよう。それにアレだ。コンパイラの作者もアレだ、 提案: main() の前に int と書いて、定義の最後の } の前に return 0; とでも書いてみたらどうでしょう? いえ、いいんですけどね、用が ないならこの提案は無視して下さい。 とかきわめて控えめかつ親切に表示してくれとか思うわ。ほんま。
>>583 ほんとはintなんだけど(見えないところで定義されてる)
voidでも通るのは コンパイラが甘いため(警告は出してる)
15歳以下は出場できないというきまりなんだ。 決まりにガタガタ言うな。
動作終了したことに処理系が気づかない。
>>585 なによ! mainはintを返さなきゃダメでしょ!
引数まで省略しちゃって、ばっかじゃないの?
わわっ、なに涙ぐんでんのよ
ほ、ほんとうはダメなんだけど、特別に許してあげるから
今日だけ-Wno-mainつけていいわよ
あ、なに笑ってるのよげんきんね!
なにこのツンデレコンパイラ
if [ a.out = 0 ] then echo "pg is success." else echo "pg isn't success." end こんな処理してもいいわけよ。めちゃ適当だけど(動くかどうかもわからんw)
>>591 0返してるのにisn'tになったお(^ω^;)
スレ違い
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 読みにくいですがなにとぞアドバイスお願いします
596 :
594 :2006/01/03(火) 01:17:45
う、すません テストは windowsXP エディタCPAD コンパイラLSI C-86 でさせていただきました
>>594 scanf("%s", name);で名前を入力し終わった段階で、
入力確定時に押したEnter(改行コード)がバッファに残ってしまうので
その直後のgetcharや%cでの読み込みは、その改行コードが読み込まれて終わってしまう。
"%s%*c"にするか、fgets+sscanfに書き直す(後者を推奨)
>>560 遅レスだけど、入門書から勉強し直した方がいいよ。
見てるこっちが恥ずかしくなるから。
>>594 ええっと、残念ながら scanf() を使ってる限り「安全」なプログラムにならないんだよね。
1. オーバーフロー等非対応
2. 配列の容量を超えて際限なく読み込みと同時に書き込んでメモリー内容を破壊
3. キー入力バッファーに読み残しをする。次に呼ぶとバッファーの残りを読んでそれが
指定された形式に当てはまらないとそのまま返ってきてしまう(しかもまた残す)。
で、普通は fgets() sscanf() fflush() の3つを使って読み取るんだけどそれでも変なこと
が起こるので、長くやってる人はコツコツ作りためた自前の読み取り関数をコピーしては
使ってますわねえ。
>>597 横から質問させていただきます。
>"%s%*c"
このような書き方について解説しているサイトを教えていただけないでしょうか?
探しても全然ヒットしません
printf("名前は?正しけりゃ'y'打てよ"); do{ fgets(name,sizeof(name),stdin); }while((check=getchar())!='y'); がおまいの仕様を満足させてくれるだろう 正しいですかと聞く意味がよくわからんのだが?
>>602 即レスありがとうございます
検索が下手なばっかりに、お手数おかけしました
fflush(stdin)は未定義だろ?
606 :
594 :2006/01/03(火) 01:50:54
>>597 ,
>>594 さま
アドバイスありがとうございます。
以前scanfは空白を含む英文みたいなものを
入力できない(できたらスマセン。近々ためします)
というのもあるので危険とかも読んだことがあります。
若干難しそうなのでスルーしていました。
そのときに用意した配列以上の入力も読み込んでしまうなども
書いてありました(独習Cかな?)
よく考えてみますが、よろしければ自作入力関数作成のヒントを
ください。fgetsということはファイルを利用するということですか?
getsのオーバーフローなどについて調べてみます
>>598 よろしければスタンダードありましたら教えてください><
>>602 ちょっと思いつきで作ったものなのですが、
実利用しているプログラムの中ではdowhileループの中に
複数の入力をしてたりしているので反射的にしたようです。
たしかに「入力内容は正しいですか?[y/n]」はちょっと
わずらわしいですねw
あり!
>>606 fgetsの入力元をstdinにすると、標準入力、一般的にはコンソールからの入力になる。
scanf(**);とfscanf(stdin,**);は同義
>>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を入れたらいいのですがあんまり作業が大変です。。。 検索してもどうにもその手の情報は発見できませんでした。 よろしければご教授くださいますよう宜しくお願いします。
611 :
610 :2006/01/03(火) 07:49:51
すみません、分かりにくかったかもしれません。 例えば.exeのように、特定のアプリケーションがなくても単体で動作するような形にするのが最終的な目的です。
612 :
デフォルトの名無しさん :2006/01/03(火) 07:53:12
割れ使ってるのか?
>>610 それができないで一体何のためのプログラミングだと思う?
615 :
610 :2006/01/03(火) 09:20:49
すみません、遅くなりました。
Releaseビルドで調べてみたらVC内で作成可能ということが分かって色々やっていました。
ただソースコンパイルは通っているはずなのですが、どうやっても
>fatal error C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
と言われビルドが完了しませんorz
エラーメッセージ自体も検索したのですがいまいち有効な対応策が得られていない状態です。
みなさまのお知恵を拝借できればと思います。
>>613 割れではありませんが友人宅等で使用する場合に「VC入れさせて」では面倒だと思いました。
>>614 ですよねorz
>>615 #include <stdafx.h>
あと氏ね。
617 :
610 :2006/01/03(火) 09:36:33
618 :
デフォルトの名無しさん :2006/01/03(火) 10:25:57
>>617 >>616 はこの板でよく使われている常套句だ。C++相談室の最初の方を
見てみろ。これを知らないという事は、お主2ch初心者だな?
620 :
511 :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
最初から順番に1いれて、結果はランダムだと言い張ればいいんじゃね? あと気をつけるのは配列サイズよりnのが大きいときだな。 冷たいお湯をくれと言われても困りますよ。
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を使う はなしでお願いします。
(゚Д゚)ハァ?
627 :
624 :2006/01/03(火) 16:36:38
> 626 一瞬で解決しました。 ありがとうございました。
ケツへfseekしてftellじゃだめかい?
サイズわからねーのにいきなり読み込むのはヤバイからな。
>>628 の方式でおながいします。
fseekで移動したあと元に戻すのも忘れないでください。
長文になりますが、スマソ 正月になんで゜ρ゜)ボーっとしていたら、 不意に終了時間と開始時間を入力して、時間差を計算するプログラムを、 作りたくなって、作ったのですが、美しくありません 誰か、華麗なコードに変身させて下さい #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; }
スマソ 3行目 × intarg_1,arg_2,arg_3,arg_4,time,min; ↓ ○ int arg_1,arg_2,arg_3,arg_4,time,min; です
マジレスすると美しい日本語を勉強するのが先
>>630 許されるのなら日付→UNIX時間に変換して
UNIX時間同士で引き算してUNIX時間→時分秒
入力チェックはどこまで行っても泥臭いもの
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を代入するところが出来ません。 よろしくお願いします。
rand()
638 :
636 :2006/01/03(火) 22:48:07
>>637 rand関数を使えば良いということはわかるのですが、具体的にどのようにするかがわかりません。
教えていただけないでしょうか?
>>636 0初期化するなら、初めからcallocを使ったらどうかと思う。
それはともかく、arr[0]〜arr[m * n - 1]までが配列の要素なのだから、
0〜m * n - 1の範囲で乱数を発生させれば良い。
ただし、乱数によって選ばれたところには既に爆弾が置かれていた場合を考えること。
>>638 いくらでも方法はあるじゃん
・配列の要素を
0 1 2 3 4
5 6 ・・・
・
・
20 21 22 23 24
と考えてrand()%25
・rand()%5の二重ループにして、列,行を決定
とかね
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 までの乱数を発生させる。 ・・・以下略・・・ } }
642 :
636 :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;
}
}
この後どうすれば良いでしょうか?
なぁ、基本くらい、本か何かで勉強してから人に聞こうぜ・・・
644 :
636 :2006/01/03(火) 23:14:18
>>643 すいません。一応ある程度は勉強しているのですが。。。
rand_arrayは0初期化しておくことってまぁ、いらねえかw
ていうか宿題スレいけよ
649 :
636 :2006/01/03(火) 23:44:01
>>648 宿題スレに書き込もうと思ったのですが、まちがって、ここに書き込んでしまい、そしたらレスが帰ってきたので。
宿題スレいきます。
getch()はint型の文字コードを返すということですが printf("%d,%d", getch(), '\n'); というプログラムで enter押すと,13,10ってなるんですが,意味不明 '\n'はエンターキーの文字コードだと思うんですが,エロイ人教えて下さい
>>650 それはつまり、お前のところでは'\n' == 10であり、
getch()でEnterを押すと13が返されると言うことだ。
13というのはおそらく'\r'と等しいと思われる。
'\n'は改行文字であるが、Enterを押すと'\n'が入力される保証はどこにもない。
ここまで書いてから気が付いたが、getch()は標準関数でないからしてスレ違いだ。
getch は環境依存でスレ違い
_getchは絶対に1文字しか受け付けないから 不正入力チェックが超楽
>>624 マジレスすると、標準Cでの標準的な方法はない。
# ファイルの概念がないプラットフォームが存在するため
while文使って1バイトずつちまちま書き込んで freadの戻り値チェックしつつEOFまでループ バイト長求めなくても何ともないぜ
1バイトずつちまちま読んだら遅いじゃんかよ。 fread の戻り値使えよ。
>>656 バッファリングしていると信じているのだから見かけ1Byteずつでも気にしないのさ。
最終行がガンダムネタだと気付いて欲しかった独り身の正月明け
>>657 1バイトずつ余計な処理が大量に入るのだから、
バッファリングされていようが無駄が多いぞ。
660 :
デフォルトの名無しさん :2006/01/04(水) 14:27:09
>>654 それは freestanding environment の場合であって
hosted environment で論じる限り、ファイルの概念は「必ずある」ぞ
661 :
デフォルトの名無しさん :2006/01/04(水) 14:29:10
>>659 無駄を実際に抑えるかどうかは場面ごとの必要性によるけど
気づいていない〜無関心のまま居直る奴とは組みたくないよな
標準C縛りだったらfseek(fp, 0, SEEK_END) でファイルの最後に持っていってftell(fp)でいいんじゃね?
まあ、大抵機種依存の関数使うんだけどな。 どうしても移植性が欲しいってんなら、 関数化して、#if で分岐して定義を変えて、 #else で fseek, ftell 使えばいい。
unsigned intってなんて読むのデツカ
アン サイン ド インテジャー もしくは アンサインド イント
>>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 で求まる
669 :
デフォルトの名無しさん :2006/01/04(水) 17:03:15
そうだった・・・ アフォ>自分
頼むから2の冪乗ごときにpow()を使わんでくれ。
2のべき乗じゃなくてnのべき乗を求めたいんでしょ?
>>666 は例として2^2を出しただけで
2乗なら x * x で良いと思うがね。
666です、みなさんどうもありがとう
>>672 さん
短順に2のベキ乗が知りたかっただけです実は、今年、基本情報技術者資格を
受験しようと思っていて、午前問題の参考書の中で
平成16年度春問10
2種類の文字"A","B"を1個以上、最大n個並べた符号を作る。60通りの
符号を作るときのn個の最小値は幾らか。
という問題を見て答えは5個なのですが、そう言えばc言語で
2のベキ乗ってどうしたら計算できるのだろうかと思い、borland C++
でやって見たのですが、うまく出来なかったので、
ここで質問させてもらいました、ありがとうございました。
英文のような、スペースを含んだ文字列を標準入力から得たいのですが、方法が思いつきません。 どんな方法があるでしょうか?
676 :
デフォルトの名無しさん :2006/01/04(水) 18:00:05
>>675 ちょっとした実験なら scanf が便利
パーサなどを作るときは本腰入れてトークン分解を作る
strtok もあるけど俺は勧めない
678 :
デフォルトの名無しさん :2006/01/04(水) 18:03:44
すいません プログラム初心者ですが、c言語を知ってれば今の時代のパソコンのソフトも作成できますよね?
>>676 ,677
scanf("%s ",s)をループでも回し、一周ごとにスペースを挿入していこうと思ったのですが、
入力文字列にスペースが無い場合に対応できない上に、ループの終了条件がわかりません
>>677 「注意深く」とはどういうことでしょうか?
fgetc(stdin)使えばスペースも一文字
俺はfgets→sscanfの黄金コンビを勧めとく
683 :
デフォルトの名無しさん :2006/01/04(水) 18:11:41
>>678 現に市販されているソフトのクローンが作れるかってこと?
それとも PG 職に就けるかってこと?
>>679 >入力文字列にスペースが無い場合に対応できない
どゆこと?
つかscanfだって("%[]",s)ってやればスペースだろうがお構い無しだぜ
>>681 ありがとうございます。
ループを回して、改行を終了条件にすればいいんですね
>>682 getsでできました!
こんな関数初めて知りました
ありがとうございます
sscanfについても調べてみます
>>684 試したのですが、入力を受け付けずに次の処理に行ってしまいます
gets を使ったのか ミ゚仝 ゚ ;ミ ..................
>>683 >>入力文字列にスペースが無い場合に対応できない
>
>どゆこと?
入力する文字列が
"all people"などではなく
"everyone"のようにスペースを含んでいない場合です
>>685 頼むからgets()だけは使わんでくれ。
689 :
デフォルトの名無しさん :2006/01/04(水) 18:27:45
>>687 どっちも scanf("%s ",s); で入力できるはずだけど?
改行も空白の一種なのは認識してる?
(σ・∀・)σgets()
だからこういうの作っとけよモー 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 マジレスしていいんかウケ狙いかよーわからん
>>691 そこで10とか使うようでは説得力0だな。
頼むから糞みたいなgets255()なんて使わないでくれ。
>>693 ch < 0 だって味になってないか? ミ ゚ 〜゚ミ
>>695 それはなぜ? どこに何語を使えばええ? ミ ゚ 〜゚ミ
>まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
>>697 プログラミング言語ができるということは言うなれば基礎。
実際に何かソフトウェアを作ることは応用に当たる。
その差が有るから695の言うとおりで、
Cだけではソフトウェアを作ることができない。
700 :
デフォルトの名無しさん :2006/01/04(水) 19:04:58
>>685 ちょwwwwwwwww
俺が言ったのはgetsじゃなくて「f」gets
getsは何文字でも読んじゃうからマジヤバス
>>700 なるほど
だからfgetsなんですね
勘違いしてました・・・
fgets(stdin,*,s)に変更します
ポカーンですな
>>702 fgets(s,*,stdin)ですね・・お恥ずかしい
文字列リテラルのsのサイズを数え間違えると、fgetsを使う利点がなくなるから、 fgets(s, sizeof(s)/sizeof(s[0]),stdin) とやると安心。 さらにfgetsの戻り値がnullでないかエラーチェックする方法もある。
705 :
704 :2006/01/04(水) 20:36:39
間違い探しになって(ry
>>704 null ってぜんぶこも字でいいんだっけか? ミ ゚ 〜゚ミ
>>704 というかそこで文字列リテラルと書くのは正しいのだろうか? ミ ゚ 〜゚ミ
ミ ゚ 〜゚ミ
709 :
704 :2006/01/04(水) 21:38:15
他にもあるよ、間違い探し >魚チョコ
sittaka
魚チヨコも気づかない致命的な間違いを俺には分かる・・・ そう!!セミコロンが無い!!!(`∀´)
712 :
デフォルトの名無しさん :2006/01/04(水) 22:48:58
sizeof(s)/sizeof(s[0]) は配列の要素数、サイズは単にsizeof(s)でおk
sizeof は関数じゃなく演算子
はて、今の流れで誰かsizeofが関数だといった人はいたでしょうか?
715 :
デフォルトの名無しさん :2006/01/04(水) 23:33:52
712
>>704 そういえばsizeofで型でもないのに括弧をつけるのはやや一般的ではないと思う。
俺は見やすいから変数も型も"()"で括るけど
718 :
デフォルトの名無しさん :2006/01/04(水) 23:54:06
個人的主観に凝り固まってる奴とは話すだけ無駄
retuenに()を付けない派の俺が来ましたよ。
文法作法は好みの問題,突っ込むとアレるよ?
721 :
デフォルトの名無しさん :2006/01/04(水) 23:57:16
>>716 () を必ずつけるという主張(というより宣言か)は明白に非標準
722 :
デフォルトの名無しさん :2006/01/04(水) 23:57:44
せんせい、retuenってなんですか!
リターンにはつけないけど、sizeofにはつけるな。式中で使うか使わないかが ポイントかも。
returnにもsizeofにも()をつけるオレ様は非標準ですかそうですか
>>721 非標準ってのは、標準Cではないという意味?
726 :
デフォルトの名無しさん :2006/01/05(木) 00:01:29
>>720 「個人的」好みという主張は論議に値しない
727 :
デフォルトの名無しさん :2006/01/05(木) 00:02:10
>>725 () がなきゃ ill-formed とでも言わんばかりに金切り声くるもん
空文ですら許容されてる言語で、わざわざ論議するほどのことじゃないと毎度思うが、 それでもやめないんだよな、、、
だから言ってんだろ、目玉焼きには醤油だって! ソースなんて掛けてんじゃねえよ、バカ!
いや、片面焼きの半熟に決まってる。
標準だろうがなんだろうが、コンパイラが式を評価できればいいじゃんか。
どうせなら、すべての式に()つけろよ。規格には反してないぞ。
>>732 確かに腹に入れば気にならないが、その前に味わいたいじゃん
え?sizeofには必ず()付ける派だけどこれ文法違反なの?
736 :
デフォルトの名無しさん :2006/01/05(木) 00:13:00
738 :
デフォルトの名無しさん :2006/01/05(木) 00:13:56
派とか言い出すガイキチはいなすのみ
739 :
デフォルトの名無しさん :2006/01/05(木) 00:15:18
目的意識がない〜ずれてる奴とは空回りするだけだし
またどうでもいい事で荒れてるな どっちでも問題ないなら好きな方使えばいいじゃねーか
741 :
デフォルトの名無しさん :2006/01/05(木) 00:17:16
問題はある 何に照らして問題かが いくら言っても通じない
>>741 ごめんなさい
どういう場合にカッコをつけるorつけないのが問題に
なるのかよくわからないので具体例で教えていただけると・・・
743 :
デフォルトの名無しさん :2006/01/05(木) 00:46:08
そんな枝は末節はどうでもいい そいつが根ざしている基本方針があさってを向いているんだよ
>>742 所属している何らかの団体のコーディング規則に反していない限りは、
何も問題にならない。ただの好みの問題。
745 :
デフォルトの名無しさん :2006/01/05(木) 00:53:45
*:「なにい!? 俺のコードにケチつける根拠法令を言ってみろお!! コーディング基準の第何条だ! え、おい貴様ボコすぞこら
746 :
デフォルトの名無しさん :2006/01/05(木) 00:55:00
「えだは」って何??
747 :
デフォルトの名無しさん :2006/01/05(木) 00:55:43
枝葉の誤変換
ある関数を作って、引数をもらう際に、その引数の中身が 文字列か整数かを見分ける方法ってありますか? また、その情報(文字列または整数)をlongの型に入れてさらに他の変数に付加情報をつけ 表示方法を変えたいのですが・・・ 例: long *AAA; /* AAAの中身はわからない */ long BBB; /* BBBの中身が0ならAAAを文字列として表示 */ /* BBBの中身が1ならAAAを整数として表示 */ できますか?
750 :
デフォルトの名無しさん :2006/01/05(木) 01:15:03
>>749 できない
つーか、自分で答え書いてるやん
型情報をつければいい
>>749 >long *AAA; /* AAAの中身はわからない */
どうみてもAAAの中身はlong型のポインタだし
*AAAはlong型に決まってるよな
C++じゃあるまいし引数として受け取る変数の中身なんて決まってるだろ
>>749 AAAから変換したい文字列と整数が、どんな値の範囲かにもよるが、
やろうと思えばできるけど、かなりアクロバット。
本当にそんな仕様にしないといけないのか、
プログラム設計から考え直した方がいい。
753 :
デフォルトの名無しさん :2006/01/05(木) 01:19:10
チャンクとか作ってると出てきそう
a = sizeof(int) * 10 a = sizeof int * 10 後者はきもくないか?
テラキモス
カッコ無しはやったこと無かったんでエラーになるとは知らなかったよ。 つーか、ならカッコ必須じゃん。カッコ無しで使ってるやつテラフシギ
758 :
デフォルトの名無しさん :2006/01/05(木) 09:35:14
a = sizeof a * 10; a = -a * 10; a = *p * **pp; 単項がきもいやつぁ C 界では異端だよ 黙ってる分には構わんがガタガタ言うやつは氏ね
>a = *p * **pp; *pで助かってる様なもんで、pにだったら途端に括弧つけるんだろ?
760 :
デフォルトの名無しさん :2006/01/05(木) 09:43:33
言ってる意味わかんね
sizeof って長くていやんだから #define o sizeof ってやっちゃってますが何か? ミ ゚ 〜゚ミ
記号の単項は小学生のころからなじみあるからね。問題ない。 ってか、 sizeof int って書くとエラーになるじゃん。かっこつけ たくないとか好みの問題じゃないよ。 ユーザー定義型だとカッコ無しでも平気みたいだけど、内蔵型と そうでないとき書き方を変えてるほうが一貫性無いだろ。
763 :
デフォルトの名無しさん :2006/01/05(木) 10:00:43
>ユーザー定義型だとカッコ無しでも平気みたいだけど 仕様を理解してないやつが一貫性とは笑わせてくれる
実際試してそうなったんだからそう書いたんだよ。VC6な。 お前のとこのコンパイラじゃどうかしらんが
765 :
デフォルトの名無しさん :2006/01/05(木) 10:06:11
VC6 に限ったことじゃないが、ん? と思ったら規格票くらいあたれ 愚にもつかない即レスは煽り屋以外の誰も期待してない
だからお前のところのコンパイラは sizeof int でエラーにならんのか?
767 :
デフォルトの名無しさん :2006/01/05(木) 10:10:15
俺んとこのコンパイラでは int は「ユーザ定義型」じゃないんでね
はあ? どこに int がユーザー定義型だと書いてある? 日本語読めないのか?
769 :
デフォルトの名無しさん :2006/01/05(木) 10:19:47
どっちでもいいよ もともと「式」と「識別名」は文法上あらわれる位置が全然違うもので たまたま sizeof のところが似てるからって同じにしなきゃならんという道理はない どうしても sizeof の第1オペランドが型識別子の場合の括弧を必須にしたいんなら あんたが ISO のワークグループにでも参加したらどうだ?
770 :
デフォルトの名無しさん :2006/01/05(木) 10:20:50
あ、失礼 s/「識別名」/「型識別名]/
>>757 とほか数名
型名ではなく、式ならsizeofには括弧が要らない。
772 :
デフォルトの名無しさん :2006/01/05(木) 10:40:41
-sizeof の第1オペランドが型識別子の場合 +sizeof の第1オペランドが式の場合 あーあ、何やってんだろ俺・・・
て言うか上で小理屈並べてる奴頭大丈夫か? そもそもカッコつけないとエラーになるんだったら議論の余地ないじゃんよ
おれは, 「sizeof の取り得るオペランドは``式''か``キャスト''」 って, 覚えさせられた. 表現に問題はあるが, 現実的には無問題.
だからインスタンスやユーザー定義型ならカッコ無しでもいけるが、 組み込みだと駄目っぽい。組み込み型でカッコ無しだとあいまいな ところが生じるとも思えんのだが、何でだろ? まあ、カッコ書いとけば間違いない。 returnはどんな場合でもカッコ無しで問題ないからつけなくても 問題ない。
一貫性がどうこう言っている奴は単文に{}を必ず付けるの? 複文の時には{}を付けなければならないけど。
つけるよ
{done:;}
>>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)
%
>>776 マジレスするとつけたほうが良い。現実そうなってるかどうかは
別問題だが、つけたほうがいいには違いない。
>>775 ユーザー定義型も括弧が必要だと思うが。
>>776 > 一貫性がどうこう言っている奴は単文に{}を必ず付けるの?
> 複文の時には{}を付けなければならないけど。
{}を付けた時点で単文ではなくなるだろ。
{
>>784 ;}
はいはい、{ /* コメントもちゃんと { } で囲んでおこうね */ }
{ // てゆーかこの手のネタを食っちゃいけないのか ミ゚仝 ゚ ミ
}
まぁ、阿呆な糞コテはさておき、漏れも一行野郎以外は複文化するな。 つまり、 if (foo < bar) foo = bar; for (p = str; *p; ++p) ; こう書くか if (foo < bar) { foo = bar; } for (p = str; *p; ++p) { } こう書く。
>>788 str代入してインクリメントってなんか違和感感じるなw
俺は前者だな。
>>785 コンパイラなんだい? VC6だとユーザー定義型(構造体とか)
はカッコ無しでも通るよ
>>788 馬鹿
おやおや、素早いレスだことで。考え変えた。ここって辛気臭いプログラムでたまったストレスを発散させるとこだったのねえ。
てえわけで
for ( p=str; *p; ++p ) ;
だ。末尾のセミコロンが軽くて見づらいから、どうせなら、
for ( p=str; *p; ++p ) { ; }
と書くか、
for ( p=str; *p; ++p ) {
;
}
と書いた方がああしっかり空ループなんだなあとわかっていいんじゃないか?
>>788 みたいな馬鹿が好きそうなコードだこのチンカス ミ ゚ 〜゚ミ
>>790 俺はVC7.1を使っていて括弧をつけないとだめだが、
VC6なら通るという問題ではなくて、規格で構文がそう定められているから必要なんだ。
>>792 >規格で構文がそう定められている
つうことはVC6が基準を満たしてないのね。了解。
まあおれはsizeofにはカッコつける派なので問題ない。
>>779 宣言と文は区別しろ。C++じゃないんだから。
>>791 >
>>788 馬鹿
他人を馬鹿呼ばわりかよ、だからうざいってんだ。
>おやおや、素早いレスだことで。考え変えた。ここって辛気臭いプログラムでたまったストレスを発散させるとこだったのねえ。
悪いな、たまたまだ。現にこのレスは遅れたからな。
>てえわけで
>for ( p=str; *p; ++p ) ;
>だ。末尾のセミコロンが軽くて見づらいから、どうせなら、
>for ( p=str; *p; ++p ) { ; }
>と書くか、
>for ( p=str; *p; ++p ) {
>;
>}
>と書いた方がああしっかり空ループなんだなあとわかっていいんじゃないか?
>>788 みたいな馬鹿が好きそうなコードだこのチンカス ミ ゚ 〜゚ミ
つーか、見づらいというより醜いな。まるで糞コテ愛用のAAのようだ。
魚チョコはバカなのでいじらないように。
799 :
デフォルトの名無しさん :2006/01/05(木) 22:18:04
>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などを使わずに抑制する方法を教えていただけませんか?
ポインタをDWORDにキャストするのは何故?
>>800 そりゃ printf に似たことをしたいってんだろう。正確には分からないが……。
問題は "long *AAA"。AAA がポインターなのは分かるが、AAA を参照した先に文字列があるのかどうかだ。
もしかすると 【呼ぶ前】 *AAA=0x30313233; みたいな固定長文字列(つーか多バイト文字定数)かもしれないし。そうなりゃエンディアンの影響受けるし。
もしかすると、【呼ばれて】 char *CCC; CCC=(char*)AAA; として扱って欲しいのかもしれないし。
もしかすると 【呼ぶ前】 *AAA=(long)"uochoco"; long 整数と文字列の先頭へのポインターが記憶場所を共用してるのかもしれないし。そうなるとポインターが long に納まりきるかunion 使えって話になるし。
804 :
801 :2006/01/06(金) 00:40:47
早速どうも。 インタフェイスがDWORDなのですが、 そのDWORDをまた新たにポインタにキャストしなおして再利用したいのです。 windowsでいうとSetWindowLong();のような感じです。
>>804 プロジェクトのプロパティ→C/C++→General→Detect 64-bit Portability IssuesをNoに。
あとスレ違い。
806 :
804 :2006/01/06(金) 00:50:28
>>805 言語レベルでは抑制できないんですね。
このwarningを出すのはVC++の仕様だとしたらVC++の設定で抑制してもいいですね。
どうもありがとうございました。
>あとスレ違い。
そのようでしたね。失礼しました。
807 :
806 :2006/01/06(金) 00:55:12
ああそうか64bit対応のコンパイラだとポインタが64bitの可能性もあるから それをDWORDにキャストすると情報が欠如するってんでwarningが出るんですね。 すっきりしました。
何スレ違いのレスして勝手にすっきりしてんだ
>>804 > インタフェイスがDWORDなのですが、
> そのDWORDをまた新たにポインタにキャストしなおして再利用したいのです。
ポインタをDWORDにキャストして、受け側でポインタ型にキャストし直す、
など、腐った設計するな。
素直に void * で渡して、型を識別する情報と、
void * で示す先のオブジェクトのサイズを渡しておけ。
# 元々主旨の違うI/Fを参考にするな!
>>809 しかしSetWindowLongを使ったポインタの受け渡しは、
ウインドウをクラスにカプセル化する際に必ずといっていいほど出てくるけどね。
スレ違いだな。
10年以上前に設計された失敗作がいつまでも使われるハメになっただけのこと
\x1b[2J で文字が消えるはずですけど消えません。 何でですか?
>>812 それは端末の都合。言語とは関係ないのでスレ違い。
>810 SetWindowLongPtr
typedef struct { unsigned char r, g, b; } pixel; static pixel red = {255, 0, 0}; こんな感じで、ピクセルを表す構造体と基本的な色の変数が定義されたヘッダがあるんですが このヘッダをincludeしたファイルをコンパイルすると "redが定義されてるけど使われてないぞ"って類のwarningが大量に出ます。 基本色のピクセルはよく使用するのであらかじめ定義しておきたいのですが、 使わないときにはwarningが出てしまうので嫌なんです。 このwarningを回避する方法って無いでしょうか?
>>815 constつけてもダメ?
gccで-std=c99ならそれでいけそうだが。
#つーか、該当環境スレ向けか?
817 :
デフォルトの名無しさん :2006/01/06(金) 14:13:51
818 :
815 :2006/01/06(金) 15:12:39
>>816 constつけたらいけました。ありがとうございます。
英文を入力して、その英文の過去形を出力するものなんですが、 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
さようなら
mainは値を返せっつの
void mainよりはましだ。
C言語初心者の質問なんですが、 行列計算などをするとき、配列つかってプログラム書くよりポインタでプログラム書いた方が 演算速度が速いって聞いたんですが、どのぐらいの違うもんなんですか。
>>826 いやいや
マ○コ3つ半と○ンコ1つぶんくらいじゃね?わからんけど
>>825 君がポインタを使って書いたものより、俺が配列を使って書いたものの方が恐らく速い。
>>825 実際のところ、現在のコンパイラはそれくらい最適化でどっちでも同じコードを吐く。
だから読みやすかったりわかりやすかったりするほうを選びなさい。
>>825 君が配列を使って書いたものより、俺がポインタを使って書いたものの方が恐らく遅い。
>>825 ポインタは速くて配列が遅い、
なんて迷信いつまでも信じるなよ。
マジレスするとデータの大きさによる
マジレスすると、もうかれこれ20年も前からコンパイラにとってはどちらも同じ。
配列とポインタってあんまり律速要因にはならんような気がするのだが……。 アルゴリズムが同じなら、速度に影響があるのはこんなところ? ・使ってる変数が少なければ少ないほどよい。⇒レジスタへの割り当てや保存/復帰の手間が減る。 ・演算間の依存関係が少なければ少ないほどよい。⇒スーパースカラ(スケイラ?)が効きやすくなる。 ・分岐は少なければ少ないほどよい(特にループ中)。⇒パイプラインの乱れが減らせる。 ・分岐するときの真と偽の比は大きければ大きいほどよい。⇒分岐予測が効きやすくなる。 ・メモリアクセスは可能な限り局所化されているとよい。⇒データキャッシュが効きやすくなる。 ・実行頻度の高い範囲がキャッシュの大きさ以下だとよい。⇒命令キャッシュが効きやすくなる。
838 :
デフォルトの名無しさん :2006/01/06(金) 21:05:57
一応完成はしているのですが、どうもしっくりこないのでご教授いただけますと幸いです。 変数への入力を行い条件に合わなかった場合入力をやり直すプログラムについてです。 以下が簡易的に示したものですが、同じ入力文が2つもあってどうも不恰好になってしまい困っています。 実はこの部分を繰り返すため、例えば初めの入力文がないと2回目以降の繰り返しの時にスルーされてしまいます。 { 入力文 while(予期していない入力){ 入力文} }
>>838 それだけなら do-while でいい。
予期しない入力があった場合に特別な処理を挟みたい場合は、
goto 使うのが一番すっきりする。
840 :
838 :2006/01/06(金) 21:15:51
>>839 ありがとうございます!
do-whileの存在すら忘れていて変に詰まってましたorz
肩の荷が下りました。
825です。 ありがとうございました。 本とか「高速に演算できるにポインタをつかったプログラム」とかかいてあるんですけど あんまり関係なさそうですね。
ぶっちゃけ最適化された数値演算ライブラリ使うのが一番早いし速い。
838の書き方でもいいんじゃない?
>>843 漏れもそう思う。
最適化しちゃうコンパイラもあるかも無いかもしれないし。
て言うか速度がめっさ変わらない限りは見やすいプログラムが一番いい さすがにバブルソートとかは論外だけど
空入力を2回繰り返したらキャンセルってのを実装するため 入力部分を2回並べるか誘導変数を使ってループにするか 悩んだことあったなあ。どっちがいいかねえ。
>>845 でもその泡でも今どきのPCじゃ1万項目1秒程度なんだよな……。
泡姫降臨
1秒で遅いかどうかはアプリケーション依存
どんなアプリでも1秒は遅すぎ。
852 :
817 :2006/01/06(金) 23:36:07
>>819 さきほどやってみようと試みましたが
Borland C++ Builderとf2cの使い方がよくわかりませんでした。
初心者なもので申し訳ないです。
853 :
928 :2006/01/06(金) 23:42:00
854 :
928 :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);
>>856 ##文字列連結演算子はマクロ定義の中でのみ有効。
自己解決しません。
859 :
デフォルトの名無しさん :2006/01/07(土) 10:31:16
づみません C言語のフリーソフトってありますか?
#define LPATHNAME L ## PATHNAME なのかな?
861 :
デフォルトの名無しさん :2006/01/07(土) 10:39:26
TEXT(PATHNAME)はできない?
>>862 それだと、UNICODEで内容が変わっちまうでしょ。
なぜだか分からんが、明示して呼び出したいみたいだし。
つーか
>>860 でいいんじゃね?
ところでプリプロセッサで↓こんな変換するの何だったっけ?
QUOTE(Nullpo) → "Nullpo"
#だったかなにかを使ったと思うんだが思い出せん(;´Д`)
#define XSTR(s) #s #define STR(s) XSTR(s)
#define Nullpo ((void*)0) のとき "Nullpo"としたいなら XSTR(Nullpo) "((void*)0)"にしたいなら STR(Nullpo)
感動した!
はいはいわかめわかめ
勘当された!
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 宿題スレ;
static char nullpo[] = { "a", "b", "c", "d" }; これだと宣言の構文エラーが出てしまうのですがどうすれば良いでしょうか。 本当に初歩的ですみませんorz
873 :
デフォルトの名無しさん :2006/01/07(土) 17:46:41
>>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; }
>>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 あたりで通らないなら別なミスの可能性が高い
static char *nullpo[] = { "a", "b", "c", "d" }; static char *nullpo = { 'a', 'b', 'c', 'd' };
>>880 自分が答えられなかったからって僻んでるのは大人気ないですよ
>>881 単純な勘違いしてるんじゃない? もう一度冷静になってコードを
じっくり見てみたら。
""で囲むと'\0'が付加されますよ
ところでここでは何を話すスレなんだ? 質問しても宿題スレか初心者スレに行けと言われるんだが タイトル紛らわしいから変えた方がいいんじゃね?
自然数 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 となるようにです。 よろしくおながいします。
丸投げ乙
マルチ乙
報告乙
if(N=3) printf(" 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 ");
これにて 一件落着ぅ
本当かよ
それだと1 2 31 3 22 ... と表示されちゃうワ
あっつ、ごめんスペースあったのネ
static char *nullpo[] = { "a", "b", "c", "d" }; これのどこがウソなのか聞きたいんだがw
メモリ確保についてなのですが、 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); と書けばいいのでしょうか?
駄目に決まってる。mallocが書けるんなら逆回しでfree呼べ
>>898 やはりmallocと同じ様にfreeしなければ駄目ですか。
スッキリしました、レスありがとうございます。
900 :
899 :2006/01/07(土) 21:30:15
何度もすみません。 一応聞いておきたいのですが、 for(i=0;i<n;i++){ free(p[i]); } free(p); であっていますか?
>>900 合ってるけど普通に malloc(n*n*sizeof(int)) で駄目な理由はあるんですかね。
そのやり方だと何かとめんどくさいと思うんですけど。
905 :
デフォルトの名無しさん :2006/01/07(土) 22:02:27
>>886 「質問」と「丸投げ」の違いを憶えて出直しな
>>903 malloc(n*n*sizeof(int)) は、これはこれで別の面倒がある
これが最強 malloc(sizeof(int)*n*n + sizeof(int*)*n)
>>903 メモリ確保自体では駄目な理由はないです。
多次元配列を用いず、一次元で済ますというのはもっともだと思います。
ただそれとは別の問題で、
とあるライブラリの関数に入力データの形式にあわせて、
二次元や、三次元の配列を指定してやらなければならないものがあって、
それが原因で今回は多次元で確保する必要がありました。
>>906 確かに一次元で全て済まそうとすると、
インデックスの計算などがやや煩雑になりがちですよね。
ポインタテーブル作るのと、 添え字を乗算加算で計算するのは、一長一短やね。
910 :
デフォルトの名無しさん :2006/01/07(土) 22:42:34
そゆこと
ずっと前 ↓ #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
ありかなしかでいえばあり ただ、こんなコード書いてきた奴はぶん殴るけど。
915 :
デフォルトの名無しさん :2006/01/07(土) 23:19:27
>>914 } と printf をつないでどうする気かがわからんと言っている
>>915 素直に無駄な記述と受け取っちゃ駄目なの?
ひぃ?
919 :
デフォルトの名無しさん :2006/01/07(土) 23:27:31
>>917 今回たまたま s が printf(〜); だったんで意味が通らなかったのかという見方は当然している
では、s に何が入ったとき ## に意味が出てくるのか? そこがわからんと言っている
>>919 文法上、センテンスを入れないと無理っぽいね
static char *nullpo = { 'a', 'b', 'c', 'd' }; これってビルド通らないんだっけか。 まあ素直にこうかいたほうがいいけど。 static char *nullpo = "abcd";
>>911 つーか、GCC じゃプリプロセス通らんのだが。
その ## のところで。
はじめまして。質問させていただきます。 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
>>923 その場合はどっちでもいいんだけど、見やすさを考えて後者を使うべき
( a == 1 && b == 2 ) || ( a == 2 && b == 3 )
>>924 工エェ工エェ(゜Д゜(゜Д゜)゜Д゜)ェエ工ェエ工
929 :
デフォルトの名無しさん :2006/01/08(日) 00:07:28
930 :
923 :2006/01/08(日) 00:14:13
みなさんありがとうございました とりあえず、925さんのようにやってみます。
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)が
いいと思う
まあ&&と||の優先順位が同じだと勘違いしてる人は多い罠
934 :
デフォルトの名無しさん :2006/01/08(日) 00:42:37
うだうだ言う前にコンパイルしる!
935 :
デフォルトの名無しさん :2006/01/08(日) 00:43:07
論理「和」と論理「積」だから&&の優先順位が高いという話を聞いたことがある。
937 :
デフォルトの名無しさん :2006/01/08(日) 01:02:57
>>936 リッチーの意図はおそらくそうだろう
だが今は関係ない単なる仕様で、一般の使用者は従うのみ
ISO C は原案者の手からは離れた存在で
現にリッチーでさえ確信のない機能が盛り込まれている
>>935 オマエはドアホウなのは確定な、927は恥カキっこちゃん
932が正解、933、931、924も正しい
939 :
デフォルトの名無しさん :2006/01/08(日) 01:20:30
>>938 あ、勘違いしたか?
優先順位を間違えてる連中をアフォだと言ったんだが
俺はカッコつけるな 省略して「知らない奴が馬鹿」と悦に入ってるのは真の馬鹿
処理系依存だ、馬鹿。
943 :
デフォルトの名無しさん :2006/01/08(日) 03:23:34
>>941 そういうご託は言葉を憶えてからにしな坊や
主語が「俺は」になってるうちは接点ねえけど
>>940 &&と||の優先度が&& > ||なのは(少なくとも)C99では規定されてる
JIS X 3010:2003嫁
6.5の注釈で演算子の優先度は箇条の順序と同一と書かれていて
6.5.13に&&、6.5.14に||がある
945 :
デフォルトの名無しさん :2006/01/08(日) 03:24:00
946 :
デフォルトの名無しさん :2006/01/08(日) 03:25:13
>>944 いや待て、規格合致でない処理系の目撃証言かも知れんぞ
948 :
デフォルトの名無しさん :2006/01/08(日) 03:28:17
949
950踏み逃げ
>>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のところで配列を作成するのではなくて使用した数字にフラグを立ててもよい。
あ、駄目だ。
7が間違い。
全桁に対して配列をすべてなぞる形で組まなきゃ駄目だ。
あー、でもとりあえず
>>951 組んでアレンジすればなんとかなるべ。
953 :
デフォルトの名無しさん :2006/01/08(日) 12:02:51
質問です。今GMPライブラリを使ったエルガマル暗号のプログラムを作っているんですが、512ビットのランダムな素数pをどうやったら生成できるのか分かりません。どなたか教えてもらえないでしょうか。
955 :
SOS :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ループを用いる事) とあるのですが、どのようにとけばいいか教えてください!
宿題は宿題スレへ
VC6で gettimeofday はどこに入ってるのでしょうか?
958 :
SOS :2006/01/08(日) 17:58:39
宿題スレに書いたんですが、なかなか返事が来ないので お願いします!あさってテストなもんで・・・・
>>957 Win32プログラミングのスレに移動してください
1万桁の数同士の掛け算ってどうやればいいんでしょうか?
>>961 多倍長計算のライブラリでも拾ってきて計算
>>955 printfの中のを++price[i]にしてみ
しかし最近のCの入門書、殆ど main() { } なんだよな。仮引数にvoidを明示することもなければmainがint型を返すことを明示することもない。 warningが気になるならvoid main()とせよとか書いてあるしな。
そんな事書いてる本なんて見たことないな
968 :
デフォルトの名無しさん :2006/01/08(日) 18:29:47
>>964 お前のような本末転倒型の「変なマニア」を作らないためだよ
>>965 マジか。
近所の書店の入門本(しかないけど)全部それだった。
うち一冊でvoid main()にしろとか書いてあった。
>>969 俺は面倒だとvoid main() って書くぜ
intのどこが面倒なんだ?
int<void
973 :
デフォルトの名無しさん :2006/01/08(日) 21:45:47
return書かなきゃいけないのが面倒なんじゃないか?
さすがに、そんなくだらない理由ではないと思いたいが。
こんな中途半端なスレいらないだろ。
またお前かw
978 :
976 :2006/01/08(日) 22:01:34
またと言われても・・・初めて書いたけど、 C,C++スレと何が違うの? 環境依存の有無だけ? むこうはどっちでもおkなら、わざわざ分ける必要ないやん。
>どのスレと比べてんだ? なんて聞き返さないといけないほど乱立してるのは問題だよな
982 :
デフォルトの名無しさん :2006/01/08(日) 22:07:24
返却値の型を省略した場合は int を指定したものと見なす int を返す main 関数の終端に達した場合、0 を返す このことを意図して書いているコードにそれ以上文句たれても話がかみ合うことはない
丸投げと環境依存に、スレ違いや誘導のレスばかりのこのスレに何の価値が・・・
一応CとC++は別の言語なんだから本来CとC++は別のスレにするほうがいいと俺は思う。 俺はC/C++スレとこことは棲み分けができていると思う。 向こうには初心者歓迎というスレタイに初心者が集まってきている。 そりゃたしかにここにはスレ違いなのが紛れ込んできて、 スレ違いだと追い返すのはしょっちゅうだけどさ。 あと、ここが要らなくてC/C++スレで十分というが、 なぜC++相談室ではそんなことを言い出さないのかがわからない。 C++相談室も昼頃に新スレが立ち、1000を向かえたばかりという絶好のタイミングだったのに。
>>982 確かにそうなんだが、全く解説無しって言うのはちょっと気になる。
void mainは勘弁
987 :
デフォルトの名無しさん :2006/01/08(日) 22:18:17
いまどきCに限った質問なんて宿題以外になにがある? こっちのスレの話題はC++相談室に含まれるが、 C++相談室の話題はこっちのスレには含まれない。 合併するならこっちが吸収されるのがスジだろう。
>>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 俺的には多少の環境依存は可だと認識しているけどな
環境依存と丸投げの多くが同時に来るんだよ
論点をはっきりさせようとしていないと、どちらも起こりやすくなるからな
ただ、「その環境」を使っていない人を閉め出す形が長く続くようなら
各人の良識で回避(=移動)しようやってのがわからないかい?
>>982 これも承知でvoidと書くことがあるんだ
馬鹿ですね。
そうして関数の返却値を使いこなせない自称中級者が増えていくんだな
997 :
デフォルトの名無しさん :2006/01/08(日) 22:57:18
998
999 :
999 :2006/01/08(日) 23:02:02
しー言語なら俺にきけ!!!!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。