661 :
デフォルトの名無しさん :
2005/11/19(土) 23:07:35 //暗号キーの入力 printf("暗号キーを入力してください>"); scanf("%s",key); keylen=strlen(key); //原文ファイル(入力ファイル)オープン fp=fopen(filename,"rb"); if(!fp){ printf("エラー1ファイルオープンエラー\n"); exit(1); } printf("原文ファイルオープン完了\n");
662 :
デフォルトの名無しさん :2005/11/19(土) 23:09:02
//暗号化ファイル(出力ファイル)オープン strcpy(outfilename,filename); strcat(outfilename,"_"); if(!wfp){ printf("エラー2ファイルオープンエラー\n"); exit(1); } printf("暗号化ファイルオープン完了\n"); //暗号化 while (fread(&ch,sizeof(char),1,fp)==1){ printf("ステップ1完了\n"); ch=ch+key[i++]; printf("ステップ2完了\n"); if(i>=keylen){i=0;} printf("ステップ3完了\n"); fwrite(&ch,sizeof(char),1,wfp); } printf("暗号化完了\n"); fclose(wfp); printf("wfpクローズ完了\n"); fclose(fp); printf("ファイル%sを暗号化しました\n",filename); printf("作成ファイル:%s\n",outfilename); return 0; } ステップ3完了のところでエラーがでるので fwrite(&ch,sizeof(char),1,wfp);が悪さをしているのはわかったのですがそこからがわかりません。 よろしくおねがいします。
663 :
誤爆してしまましたこれが一番上にきます :2005/11/19(土) 23:09:50
ファイルを暗号化するプログラムを書いているんですがコンパイルして実行してみると 問題が発生したためとの趣旨で終了させられます。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<dir.h> main(int argc,char*argv[]){ char ch; FILE *fp; FILE *wfp; char filename[256]; char outfilename[256]; char key[128]; int keylen; int i=0; //原文ファイル名の決定 if(argc > 1){ strcpy(filename,argv[1]); }else{ printf("ファイル名を入力してください>"); scanf("%s",filename); }
wfpにfopenしてなくないか?
してます
どこで?
if(!wfp){ printf("エラー2ファイルオープンエラー\n"); exit(1); }
なんだネタか
fopenはどこ? てか、誤爆した挙句ネタなのかよ
670 :
デフォルトの名無しさん :2005/11/20(日) 09:42:25
>>664 ありがとうございます。
strcpy(outfilename,filename);
strcat(outfilename,"_");
wfp=fopen(outfilename,"wb");
if(!wfp){
でおkみたいです。fopenし忘れる初歩的なミスでスレを汚してしまいました。
すいませんでした。
671 :
デフォルトの名無しさん :2005/11/20(日) 20:17:53
printf( "\\ is escape letter\n"); などと書いた場合に、エスケープシーケンスの部分\\の解釈 はプリプロセッサが行うのでしょうか?
いいえ
ビルゲイツが行います
674 :
671 :2005/11/20(日) 20:21:53
コンパイラが行うのでしょうか?
はい
いいえ
677 :
デフォルトの名無しさん :2005/11/20(日) 20:26:04
ウインドウを表示するプログラムをコンパイルしたのですが、 外部シンボル ’_main’が未解決 (C:\borand\bcc55\lib\cox32.obj が参照) っていうエラーがでます。 どういう意味ですか?
WinMain()がスタートアップだったら、コンパイラオプションでなんか指定してやらんといかんかったはず。 当該スレへ。
679 :
677 :2005/11/20(日) 20:32:33
難しいですね・・・。 とりあえずCスレではないのですね。ありがとうございました。 それでは逝ってきます。
680 :
デフォルトの名無しさん :2005/11/20(日) 21:06:09
すみません。ある文字列を配列に入力してenterキーが入力されたらそこに! をいれて表示するっていうプログラムを関数つかって作ったんですけどSegmentation faultってでてしまうんです。ちなみにLinuxです。 悪いところを教えてください。 #include <stdio.h> char ho(char ho[20]) { int i; while(ho[i]=11) { ho[i]=33; } return ho[20]; } int main() { int i; char na[20],s[20]; for(i=0;i<20;i++) { na[i]=0; } printf("文字列を入力->"); scanf("%s",na); s[20]=ho(na); printf("%s",&s); }
まあ・・・きちんと本を読むのがいいぞ。うん。
20文字確保したら、インデックスは0-19しか使えないよ。
なんか日曜の夜に激しい釣りを見ているキガス。 とりあえず、return ho[20]は何のために書いた? s[20]=ho(na)も。
684 :
680 :2005/11/20(日) 21:18:12
Linuxでenterキーのアスキーコードは72でいいんですよね? Segmentation faultってことは メインと関数の間で受け渡しがうまくいってないってことですか?
ホント釣り名人だね680は Segmentation fault の直接の原因は ho関数先頭の int i の初期化忘れ。
686 :
680 :2005/11/20(日) 21:35:08
s[20]=ho(na)ってのはna配列についてho関数を使うってことで return ho[20]ってのはho関数の結果として返してるってことですよね? あと初期化したら入力の時点で回り続けるようになりました。
s[20]=ho(na)ってのはna配列についてho関数を使うってことで return ho[20]ってのはho関数の結果として返してるってことですよね? s[20]=ho(na)ってのは20要素確保されたsの21番目にhoの返り血を代入するってことで return ho[20]ってのは引数hoの21番目の要素を返すってことです。 >入力の時点で回り続けるようになりました。 要するに無限ループに陥ったと。= と == の違いについて調べたまへ。
688 :
デフォルトの名無しさん :2005/11/20(日) 22:05:50
16進数を2進数に変換して文字列として格納するんですが、 0x12341234 => 00010010 00110100 00010010 00110100 のようにバイトに区切って1バイト毎に格納するプログラムを作りたいんです。 単純に2進数に変換するだけならできるんだけど区切る方法が思いつかなくて・・・お願いします
このスレの激初心者は飾りか? 激初心者を誘っといて釣り呼ばわりしてストレス解消とはたちの悪い奴らだな。
690 :
680 :2005/11/20(日) 22:10:34
配列として受け取るにはchar ho(char ho[])ってすればいいんですか? でもそうするとreturnがわかりません。あとメイン側もs=ho(na);に してみましたがこれでよいのでしょうか?
変換したい数をxとして、 単純に1バイトを2進文字列にする関数を引数(x >> 24) & 0xffで呼ぶ 末尾に空白を追加 単純に1バイトを2進文字列にする関数を引数(x >> 16) & 0xffで呼ぶ 末尾に空白を追加 単純に1バイトを2進文字列にする関数を引数(x >> 8) & 0xffで呼ぶ 末尾に空白を追加 単純に1バイトを2進文字列にする関数を引数x & 0xffで呼ぶ
>>690 とりあえず言っておくと、配列を返すことは出来ない
693 :
688 :2005/11/20(日) 22:14:33
配列を引数で受け取ることもできない。 引数で渡しているのは、配列先頭を指すポインタ。
695 :
680 :2005/11/20(日) 22:24:09
>>692 じゃあ配列の中身を返すのを回すのですか?
あとho関数の最初のiの初期化ですがi=1を加えると無限ループになってしまうのですがこれはまちがっているんですか?
別の配列に入れたいんなら、その配列も一緒に渡すようにすれば? ho(na, s)って言う感じに
>>689 680みたいなコード見ると昔の自分を思い出して恥ず〜で「釣り」って書いちゃうんだよ
サポートはサポートでやってるんだからそう怒るんって。
>>695 C言語では配列は0から始まる。char na[20]; と宣言したなら、
na[0] から na[19] までが有効な範囲だ。
while(ho[i]=11) というのは ho[i] に 11 を代入した上で
ho[i] がゼロであるかどうかを判別しているので無限ループになる
以前は ho[i] が例えば ho[-38234] とかになってたせいで
Segmentation fault になってたわけだわな。
698 :
688 :2005/11/20(日) 22:51:38
すまん、いざ作ってみようと思ったが全然ダメだった・・・ 軽くでいいからヒントお願いします・・orz
699 :
680 :2005/11/20(日) 22:57:14
もうなにがなんだかわかんなくなったので具体的にどうすりゃいいか 答えおしえてください。ごめんなさい
あきらめろ。
>680 まあ、誉められた方法ではないが。 int main(void) {char buf[100]; while (gets(buf)) printf("%s!\n", buf); return 0;}
702 :
680 :2005/11/20(日) 23:11:35
Linuxとg++だとgetsでエラーがでます。 配列と関数では無理ってことですか
>>702 getsはバッファオーバーランなどの危険が伴うから。
fgets使え。
あー。エラーちゅうか警告な。メンドイんで、書いてしまった。 int main(void) {char buf[100]; while (fgets(buf, 100, stdin)) printf("%s!\n", buf); return 0;}
705 :
680 :2005/11/20(日) 23:18:11
せっかく教えてもらったのにあれだけど
>>680 をなおしてもらえませんか?
706 :
680 :2005/11/20(日) 23:44:30
Linuxのenterってアスキーコードでなにですか?
>>706 LF
ただしCではどんな環境でも改行文字は'\n'と定められている。
(たとえばWindowsでは入出力時に\r\nと\nの変換が行われている)
バッファオーバーランってなんですか? 具体的にそれがどういうことをされると、どういった危険が伴うんですか?
まずはぐぐれ
>>708 バッファオーバーランとは本来実行するコードやそこへのアドレスが書かれたメモリにデータが書き込まれてしまうこと。
華麗に悪用されるとクラッカーにプログラムの実行を乗っ取られてしまう。
ウィルスを仕込んだり機密データを読み取ったりその気になれば自由自在。
説明が逆だな。間違っちゃいないけど。
2つの文字列が同じなら〜を実行っていうプログラムを書きたいんですが char str1[] = "aaa"; char str2[] = "aaa"; if(str1 == str2){ ・・・・ } ではうまくいきません どうすればいいんでしょう
>>712 入門書でも読めば?
そんなレベルの質問をずっと続けるつもりですか?
ごめんなさい
そして誰も来なくなった
ここは激初心者にやさしくないスレですね。
>>712 char str1[ ] = {aaa};
以下同様に...
>>717 ありがとうございます。
一文字ずつ比べてたorz
720 :
デフォルトの名無しさん :2005/11/21(月) 22:24:20
文字列の入力でEOF文字が入力されると処理を終了するってのを作りたいんだけど、 判定文って scanf("%s" , str ) == EOF じゃだめなの?
scanf は引数の解析がワヤなねんの意味でEOFを返すんで 終了させたかったら CTRL+Z なり CTRL+D なり打ってってね、 という了解の上ならそれで良いんじゃないの。
止めた方がいいと思うなぁ。
#defineで定義するマクロに、配列を引数として使うにはどうしたらいいんですか?
先ずは初心者らしく、やりたいことを具体的に書きなさい。
725 :
デフォルトの名無しさん :2005/11/22(火) 14:02:46
先生方すいません、質問です。 計算結果を出力しようとしたら 1.#QNANO って出るんですが↑ってどうゆうことですか?
先ずは初心者らしく、問題のプログラムを貼りなさい。
printf("1.#QNANO\n");
728 :
デフォルトの名無しさん :2005/11/22(火) 14:21:47
すいません。 プログラムがかなり長いので‥w printf("%3f %f\n",s,ins[i]); ↑でsの値とins[i]に格納した値を出力しようとしたら 0.001000 1.#QNANO と出力されてしまいましたw
>>728 恐らく、ins[i]がfloat型かdouble型じゃないか、配列の中身が壊れているんジャマイカ。
直前にins[i] = 0;すれば0が出力されるはずだ。
或いは、ins[i] + ins[i]を出力しようとしてみても何かわかるかも知らん。
730 :
728 :2005/11/22(火) 15:25:24
>>729 レスありがとうございます!
ins[i]はdouble型です。
ins[i]=0;を直前にいれると
0.001000 0.0000000
と出力しました。
ins[i]+ins[i]を出力しようとすると
0.001000 1.#QNANO
と出力されてしまいました。。
>>730 そうなると、配列の中身が壊れている。
壊れている原因はこんなもんかな。
・0割り算した結果が格納された
・初期化されていない
・他の配列操作か何かで上書きされた
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #define LINE_BUF 80 #define LOG_ARRAY 1000 using std::cin; using std::cout; using std::endl; int space(char*src){ int n; if(src==NULL){ return 0; } for(n=0;n<strlen(src);n++){ if(src[n]==' '){ return n+1; } else if(src[n]=='\t'){ return n+1; } } return 0; } int comp(const void *p1, const void *p2){ return( *(int *)p1 - *(int *)p2 ); }
int main(){ char src[LINE_BUF]; int line,z,n; FILE* fp=fopen("AHO.txt","r"); n=sizeof(src)/sizeof(src[0]); if(!fp){ printf("File open error\n"); return 0; } for(line=0;fgets(src,sizeof src,fp)!=NULL;line++){ z = space(src); qsort(z,81,sizeof(src[0]),comp); cout << z <<endl; } fclose(fp); return 0; } このプログラムをコンパイルしようとすると,test.cpp:44: error: invalid conversion from `int' to `void*'というエラーが出ます。 どこを手直しすればよろしいのでしょうか?よろしくお願いします。
>>733 >どこを手直しすればよろしいのでしょうか
該当個所だけでなく、あちらこちら。
配列について勉強しなおせ。
735 :
デフォルトの名無しさん :2005/11/22(火) 16:56:38
printf()のような可変個数の引数をとる関数のラッパー関数の 作り方を教えてください。例えば Wprintf()というものを int Wprintf(int a, const char *format,...) { if(a < 0) return -1; /* もし第1引数が負ならば即終了 */ else printf(format,...); /* ここで第2引数以下全てをprintf()に渡したい */ return 0; } な感じにしたいんですが printfにどうやって第2引数以下全ての引数を渡せばいいんでしょうか。
>>733 第1パラメータ。
なんだけど、どうやら数値と文字列の区別がついてない模様。
738 :
728 :2005/11/22(火) 17:19:39
>>731 台形公式を使った定積分の数値計算なので
式のどこかで0で割ってしまっているかもしれません。
初期化、上書きは問題ないようなので
もう一度式を洗い直してみます。
ご教授ありがとうございました!
IPを収得する方法がわかりません どなたか教えてください
>>739 MSDOSでnslookupと打てばわかる。もしくは、教えてくれるサーバに行く。
マジレスすると、DNSサーバに問い合わせる。
ポート番号は・・・・。
>>741 すみません言葉不足でした。
自PCのIPアドレスを収得したいのですが?
前回のリターン入力から今回のリターン入力までの経過時間を測定したいのですが リターンをそれぞれ読み込むにはどのようにすればいいでしょうか。
>>742 必ず127.0.0.1と決まっています。
745 :
739 :2005/11/22(火) 19:27:01
解決しました、 本当にありがとうございました
>>743 getchar 使うのが一番わかりやすいかな?
int c;
while ((c = getchar()) != EOF) {
if (c == '\n') {
/* ここで時間を計る */
}
}
>>739 Cプログラムでないなら、板違い。質問すれをすすめます。
127.0.0.1も間違ってはないが
>>739 はなんで知りたかったんだろう。
748 :
デフォルトの名無しさん :2005/11/22(火) 21:28:39
728さんは納得して去っていったみたいだけど・・・ QNANDって "Quiet Not A Number Division" 例外のことで合ってますよね?
2次元配列で文字列を出力したいのですが printfで確かめてる最中、変な事が起きました #include <stdio.h> #include <string.h> int main(void) { int i; char s1[999][999]; for( i = 0; i < 10;i++ ) { scanf("%s\n",s1[i]); printf("%s\n",s1[i]); } return(0); } これで実行してみると、最初に文字列を入力しても出力しないで、次の文字列を入力すると 一個前の文字列が出力されてしまいます。 scanfをgetsに変えたら順次出力されたのですが、これはなんででしょうか
>>749 ・scanf()の仕様をよく読んでください。
#改行コードは何のためにつけているのですか?
・gets()は使ってはいけません。
#代わりにfgets()が使えます。
・配列の要素数が999個というのは何のメリットもありません。
#判りやすく1000個としてみては如何でしょうか。
751 :
デフォルトの名無しさん :2005/11/22(火) 23:49:44
>・scanf()の仕様をよく読んでください ごめんなさい、よくわかりません >・gets()は使ってはいけません。 今のところ学校でscanfとgetsしか習ってないもので >・配列の要素数が999個というのは何のメリットもありません。 解りました、1000にしてみます
>>751 scanf( 書式指定文字列 , アドレス);
>751は天然なのか、意図的に>750の#行を読み飛ばしているかのようだ。
scanfって仕様が難しいのによく最初に教えるもんだな
755 :
デフォルトの名無しさん :2005/11/23(水) 15:01:19
CとC++って何か違うのですか? Borland C++ Compiler というのでCのコンパイルはできますか?
756 :
デフォルトの名無しさん :2005/11/23(水) 15:14:15
WindowsXPでバックスラッシュの半角がだせません。誰か教えてくれませんか?
\
758 :
デフォルトの名無しさん :2005/11/23(水) 16:11:06
たとえばn=4と入力した時に * ** *** **** ↑このように出力するプログラムはどうやって作ればいいんでしょう。どなたか教えてください('A`)
>>758 それを他人に図を使わずに説明しようと試みてください。
ほぼそれがプログラムになります。
760 :
758 :2005/11/23(水) 16:31:01
>>759 自己解決しました。ありがとうございます。
fgets(buf, 256, stdin); sscanf(buf, "%d %d %d %d %d %d", &a[0],&a[1],&a[2],&a[3],&a[4],&a[5]); こんな風にfgetsで1行取り込んだあとbufから多くの数字を取り出したいときに配列の添え字を直接数字でなく for(i=0;i<MAX; i++) func(buf, "%d ", &a[i]); のような形で取り出す方法あります? 上記func部をsscanfにしてみてもbufの最初の数字を何回も配列に放り込んでいくだけにしかならないんですが。
>>761 strtok でトークンを切り出して atoi で変換というのが方法の一つですね。
それから質問は揚げていきましょう。
>>761 sscanfだと無理なんじゃないかな。
数値のみならstrtolでループ回せば出来る。
>>761 int a[20];
int idx;
int cnt;
char buf[100];
char * str;
str = fgets(buf, sizeof(buf), stdin);
do {
cnt = sscanf(str, "%d%n", & a[ic], & idx);
if (cnt > 0) {
++ic;
}
str += idx;
} while (cnt > 0);
初心者相手だからって、随分程度低いのが多いなぁ。
766 :
761 :2005/11/23(水) 17:20:55
757に補足すると日本語フォントでは半角バックスラッシュの位置に半角円記号が搭載されているから\で良いということになる。
>>755 できる。拡張子cだとCとしてコンパイルされて、拡張子がcppなどだとC++としてコンパイルされる。
けれどCの勉強をするのであっても基本的には拡張子cppにしてC++コンパイルにするほうが良い。
なぜならC++のほうがエラーチェックが厳しくなっているから。
#include <stdio.h> main [] { printf["c programming"]; return 0; } ↑これを実行すると Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland sample.c: エラー E2141 sample.c 3: 宣言の構文エラー *** 1 errors in Compile *** とエラーがでます どうすればいいのでしょうか?
770 :
デフォルトの名無しさん :2005/11/23(水) 21:22:44
下のようなプログラムを作りました。 #include<stdio.h> #include<math.h> #define N 100 void main() { int i,n; double s,ss,average,variance,sigma,w; double a[N+1]; /*データの個数の入力*/ printf("データの個数を入力してください\n"); printf("n="); scanf("%d",&n); /*安全装置*/ if (n>N) exit(1); /*データの入力*/ for (i=1; i<=n; ++i) { printf("a[%d]=",i); scanf("%lf",&a[i]); } s=0.0;
772 :
デフォルトの名無しさん :2005/11/23(水) 21:23:18
コンパイルの仕方がわからん?
773 :
770 :2005/11/23(水) 21:23:23
(770の続き) /*データの和の計算*/ for (i=1; i<=n; ++i) s+=a[i]; average=s/n; printf("平均値 %lf \n",average); for (i=1; i<=n; ++i) { w=a[i]-average; ss+=w*w; } variance=ss/n; printf("分散 %lf \n",variance); sigma=sqrt(variance); printf("標準偏差 %lf \n",sigma); }
774 :
770 :2005/11/23(水) 21:26:04
実行すると、分散と標準偏差が+NANと表示されてしまいます。 何かプログラムに問題があると思うんですが・・・どなたかご指摘よろしくお願いします。
>>774 多分入力時の改行コードの問題。
配列をクリアもしてないからわけわからん値での計算になる。
>>771 できました、ありがとうございます
半角入力の時に()を打つときはどうすばいいのでしょうか?
さっきはコピペで済ませましたが・・・
>>776 IMEをOFFにしてShift+8や9でできるだろ。全角と何か違いがある?
>>777 8と9に()があるのに気づきませんでした('A`)
全角括弧にしたらエラーがでたので
どうもありがとうございます
ソースファイル自動整形ツールでいいのありませんか?
781 :
デフォルトの名無しさん :2005/11/23(水) 23:13:15
すみません。急遽仕事でC++をやることになって最近勉強を開始した 初心者です。いくつか疑問点に教えていただけないでしょうか。 派生クラスのメソッドが基本クラスのメソッドを呼び出せるのは分かるのですが 逆はできるのでしょうか? あるメソッド内で宣言されたオブジェクトはそのメソッドを抜けたら自動的に消えるのですか? 消えるとしたらオブジェクトのメンバのデータも一緒に消失するのですか? あるメソッド内でnewで動的に取得された構造体配列を他のメソッドから参照できるようにすることは 可能ですか? 以上、どうか宜しくお願いいたします。
>>781 virtualメソッドでオーバーライドすればいい。
ローカル定義は消える、ヒープだと消えない。
クラスの定義次第だが、普通デストラクタで消す。
可能。っつーか、できなきゃ何のためにクラス変数があるのかわからん。
>>781 (1)限られた状況で可能。
(2)(3)オブジェクトは関数などのスコープを抜けると、クラスで
あればデストラクタが呼び出されて、そのオブジェクトによって
静的に確保された領域が開放される。
(4)あるメソッド内で動的に確保された領域へのポインタを保存して
おけば、できる。ただし、デストラクタでの開放を忘れないように。
スレ違い。
784 :
デフォルトの名無しさん :2005/11/23(水) 23:33:44
>>782 すばやいお返事ありがとうございました。調べてみたいと思います。
最後の質問についてなんですが、クラス変数に構造体配列を設定できる
ということでしょうか。
その場合配列の大きさはメソッドから動的に定められるのですか?
定められるとしたらキーワードだけでもいいので方法を教えて
いただけないでしょうか。
この点だけお願いいたします。
>>783 時間差でレスしていただいたんですね。
ありがとうございました。調べてみます。
>>784 配列の大きさは配列の大きさを持つ変数を別途用意する。
787 :
デフォルトの名無しさん :2005/11/24(木) 03:49:32
788 :
デフォルトの名無しさん :2005/11/24(木) 16:03:33
すいません、質問です。 PDFファイルを開いて、VC++で作った画面に表示をさせたいのです。 そのためには、Acrobat SDKを使用すれば可能でしょうか? それとも、Acrobat SDKを使用しないでAPIみたいのがあるのでしょうか?
そもそもAcrobat SDKには何が入っているかは知らないけど、 少なくともPDFはオートメーションサーバになっているはずだから、 その気になればVC++付属のPratform SDKだけでもできる。
790 :
デフォルトの名無しさん :2005/11/24(木) 17:28:56
>>788 まず、PDFのファイル構造を理解しているのか?と問いたい。
# 後、自力で解析すればどうにでもなる。
791 :
デフォルトの名無しさん :2005/11/24(木) 18:24:43
scanfを使って数字を代入すると勝手に改行してしまうんですけど 改行させない方法があれば誰か教えてください。
int *p = NULL; p = new int[0]; とするとpはどうなるんでしょうか
>>792 要素のない配列が割り付けられる。By X 3014:2003 (ISO/IEC 14882 :2003)
だからC++はスレ違いっだってば!
二次元配列で new[5000][5000]くらいのでっかいの作りたいのですが、どうもうまくいきません intやdoubleで宣言して どうやったら大きな配列が確保できるでしょうか
リンカオプションでスタックサイズを変えるか、 malloc等で動的確保。
#include <stdio.h> int main(void){ char c; int i; long l; float f; double d; char ac[5000][5000];/* Array of Char */ int ai[100][200];/* Array of Int */ double ad[120][200];/* Array of Double */ printf("# Basic Type\n"); printf("char:\t%d\n",sizeof(c)); printf("int:\t%d\n",sizeof(i)); printf("long:\t%d\n",sizeof(l)); printf("float:\t%d\n",sizeof(f)); printf("double:\t%d\n",sizeof(d)); printf("# Array\n"); printf("char array:\t%d\n",sizeof(ac)); printf("int array:\t%d\n",sizeof(ai)); printf("double array:\t%d\n",sizeof(ad)); printf("# Array Number\n"); printf("char array #:\t%d\n",sizeof(ac)/sizeof(char)); printf("int array #:\t%d\n",sizeof(ai)/sizeof(int)); printf("double array #:\t%d\n",sizeof(ad)/sizeof(double)); } こういうので仮に2次元配列の容量を見ようとしたらとまって ↓
↑ だから、でかすぎるんだよ
#include <stdio.h> #include <stdlib.h> #define SIZE (100) int main(void) { int a[1000][1000]; int i; int *k; k=(int *)malloc(SIZE*sizeof(a)); if(a==NULL) exit(-1); for(i=0;i<SIZE;i++){ printf("[%2d]%d\n",i,k[i]); if(i%10==9) printf("\n"); } free(k); } これだと落ちます どうにかしてでかい配列扱いたいのですが
>>796 関数内で宣言した変数のために使えるメモリは意外と小さい。(通常1MiBytes程度)
動的確保するのが理想だが,とりあえずは796の配列変数を全て静的変数にしてみろ。
char ac[5000][5000];→static char ac[5000][5000];
>>798 > int a[1000][1000];
どうしてこれ残してるんだよ。
>>799 できたできたー
今まで悩んでいたのがウソのようだ
助かりました、ありがとぅ〜
ありがとありがとありがと
802 :
デフォルトの名無しさん :2005/11/25(金) 03:54:44
C言語は 独学で学べますか? 独学では限界がありますか? よく本屋にいろいろありますが 読んでもあまりよく分かんないです やっぱり独学は難しいですかね
お前には無理だ
坊やだからさ。 Aはふつう教えてないけど、でも学校で教えるのはBまでさ。 Cは自分でしなさい。Dは・・・・。っと ここにもゆとーり教育の成果物が出てるな。 自分でしねえ、できねえヤシができるようになるわけねぇだろが。バカwww そのコメントは「独学じゃあ無理ですよね!」って言いたげだな、ヲイ。 貴様が理解できない理由は 独 学 の せい じゃ な い。 あまり分からないだって?実際はまったく分からないんだろう。 学校とかで教えている内容のほうが屑だぞ。 まあ、勉強でも何でもして視野を広げられるようにしたほうがいいよ。
805 :
デフォルトの名無しさん :2005/11/25(金) 13:28:49
どこが 激初心者スレ なんだよ 結局叩くやつしかいないじゃん 典型2ちゃんって感じ
>>802 無理ですから、専門学校に行って下さいね。
>>805 勉強することは自信が持てたり、視野が広がったり、
多くのものを得られるのは事実だろう。
しかし、だからこそ教えてやらねばならんのだが扱いが
>>802 のように
難しいリアル厨などがいる。
彼らは勉強の方法すらその前にして自分も世界も若さゆえに知らんのだ。
2chとて礼節を弁え、スレを尊ばんとする者も居る。
さりとて、住人もリアルに生きているし、
>>802 のような若人には
厳しさも肝要。知らずにマルチもするだろう。
君も何れ大人になれば分かるときがくる。
808 :
デフォルトの名無しさん :2005/11/25(金) 16:50:18
>>802 独学でも出来る
とりあえず、Linuxとかgnuのソースでも持ってきて何か一つ解析してみれば?
それが終ったら自分でそれのコピーを自分で書いてみる
これが出来れば大丈夫
こらこら,みんな大げさすぎる。
810 :
半人前 :2005/11/25(金) 23:37:49
初めてのCとかCの絵本とか買え。 とりあえず初心者向け。 それと解らないのは読んでるからだ。 プログラムなんかやったことないやつが読んで理解できるわけないだろ。 ある程度基礎積んでるから他の言語の本読んでもわかる人いるけど まるっきり初心者なら本買ってきて実際ににやりなさい。 ただ気をつけてほしいのは本に書いてるのをやると実際動く。 それで理解した気にならないでほしい。本のは正解、動いて当然。 それよりもどこがどうなって動いたのか、読み解けるようになれ。 まぁ、それが解析と言うやつだ。それが出来るようになったら、別の本を買え。 君がどこまでマスターしたいのか知らんがC言語における一般的なマスターと言うのは プログラミング言語C ANSI規格準拠 第2版 を読み解けることだと私は思っている。 最後に二言、美しいプログラムを書け。 見てごちゃごちゃしてるプログラムは動くかどうかもわからない。 デバックもしにくい。 そして、コメントを書け。 自分だけでなく他の人が読んでも解るようにな。 コメントを書けば自分でも理解しながら書ける。 健闘を祈る。
自分じゃできないことを他人に薦める人が多いな 俺は除いて
嘘つけ
813 :
半人前 :2005/11/25(金) 23:51:17
うぃ、まだ私は読みきれない。
814 :
デフォルトの名無しさん :2005/11/26(土) 06:38:19
とある5次方程式の解の一つを求めたいのですが、接線がべたーっとx軸に水平に なってしまうため、ニュートン法などが使えません。ちなみに関数の形は y=x*((x+0.01214)^2)*((0.98786-x)^2)*(0.0000000000667*1.0123)-((0.98786-x)^2)*0.0000000000667*1+((0.01214+x)^2)*0.0000000000667*0.0123 というものです(ラグランジュポイントのL1を求める式です)。 y=0となるxを求めるために、何か良い方法は無いでしょうか。
815 :
デフォルトの名無しさん :2005/11/26(土) 08:56:51
>>814 y2 = y*2.0e-10/3.0 なる y2 の解を求めればええんじゃないの?
>>814 ニュートン法が使えないって事はないが、二分法で。
#include <stdio.h>
#include <math.h>
double fn(double x){
return x*pow(x+0.01214,2)*pow(0.98786-x,2)*(0.0000000000667*1.0123)\
- pow(0.98786-x,2)*0.0000000000667*1 \
+ pow(0.01214+x,2)*0.0000000000667*0.0123;
}
int main(){
double x1=0.5, x3=1.0, x2,y;
double eps=0.000000000000001;
for(;;){
x2=(x1+x3)/2.0;
y=fn(x2);
if ((y==0) || fabs(x1-x3)<eps)
break;
else if (y < 0)
x1 = x2;
else
x3 = x2;
}
printf("%.15f\n",x2);
return 0;
}
818 :
814 :2005/11/26(土) 11:26:34
>>816 すみません、どうしてそれを求めればよいのかが分かりません・・・。
教えていただけないでしょうか。
>>817 ありがとうございます、完璧に出ました!
自分でプログラムした時にはそこまで小さなepsにするとエラーが出てしまったのですが、
このプログラムだと華麗に動きますね。感動しました、ありがとうございます。
819 :
814 :2005/11/26(土) 11:59:29
>>817 プログラムを参考にさせていただいた結果、ニュートン法でも結果を得ることができました。
本当にありがとうございました。勉強になりました。
820 :
816 :2005/11/26(土) 13:53:26
>>818 すでに解決済みのようだが意図としては右辺全項に 0.0000000000667 が掛かってるんで
これを消去した式で解を求めれば速度と精度と両方向上するよねってことですた。
y と y2 が逆だな。ちゃんと確認しろよ >>俺
821 :
814 :2005/11/26(土) 14:52:07
>>820 仰る通りですね(^^;
そんな単純なことに今まで気が付きませんでした・・・。
的確なご指摘、ありがとうございます。
822 :
デフォルトの名無しさん :2005/11/26(土) 16:50:40
>三つの整数35,88,154を変数a,b,cにそれぞれ代入して、 >a+b+cおよびa-b-cを計算するプログラムを作りなさい。 出力結果は a+b+c=277 a-b-c=-207 にしたいのですが、どうすればいいでしょうか?
a = 35; b = 88; c = 154; printf("a+b+c=%d\n", a+b+c); printf("a-b-c=%d\n", a-b-c);
824 :
822 :2005/11/26(土) 17:07:04
>>823 これでいいのでしょうか?
#include<stdio.h>
int main(void)
{
int a,b,c,a+b+c,a-b-c;
a=35;
b=88;
c=154;
a+b+c=a+b+c;
a-b-c=a-b-c;
printf("a+b+c=%d\n",wa);
printf("a-b-c=%d\n",sa);
return 0;
}
826 :
822 :2005/11/26(土) 17:15:15
1.a+b+cおよびa-b-cという変数は宣言できない 2.waとsaと言う変数が宣言されていないし値の代入が行われていない
828 :
822 :2005/11/26(土) 18:10:19
>>827 2.は分りましたが、1.はどう宣言すれば良いのでしょうか?
830 :
デフォルトの名無しさん :2005/11/26(土) 18:20:50
すみません、質問させてください。 sscanfとfgetsを使って、例えば「I am student.」 と入力したとき、 I → word[0]に1 am → word[1]に2 student→ word[2]に6 と配列に文字数を格納するにはどう 書けばいいのでしょうか・・。
831 :
822 :2005/11/26(土) 18:22:28
こうですか? #include<stdio.h> int main(void) { int a,b,c; a=35; b=88; c=154; printf("a+b+c=%d\n",a+b+c); printf("a-b-c=%d\n",a-b-c); return 0; }
832 :
830 :2005/11/26(土) 18:38:34
すみません、sscanf内では%sの使用は一度で済ませたいのです。 %s%s%s・・・というのはやはり美しくないので
833 :
デフォルトの名無しさん :2005/11/26(土) 18:39:30
>>830 #include<string.h>
char s[64];
printf("%s",strlen(fgets(s,64,stdin));
834 :
830 :2005/11/26(土) 18:54:14
>>833 様のをもとに書いてみたのですが
#include<stdio.h>
#include<string.h>
char s[64];
int word[];
int main(void){
fgets(s,64,stdin);
sscanf(s,"%d",&word[]);
printf("%s",strlen(word[]));
return 0;
}
うまくいきません、配列の使い方がおかしいのでしょうか?
#include <stdio.h> #include <string.h> int main() { int i, j; char buf[1024]; char *word[256] = {0}; if( ! fgets(buf, sizeof(buf), stdin)) return 1; if( ! (word[0] = strtok(buf, " "))) return 2; for(i = 1; i < sizeof(word)/sizeof(word[0]); ++i) word[i] = strtok(NULL, " "); for(j = 0; j < i; ++j) puts(word[j]); return 0; }
836 :
830 :2005/11/26(土) 19:19:53
>>835 strokの使い方は大体わかりました。
whileで回せば区切りは出来そうです。
sizeof()という関数は別に設定する必要は
ありますか?そのままだとデバックエラーに
なってしまいますので・・・。
837 :
830 :2005/11/26(土) 19:21:05
sscanfでは出来ないのでしょうか?
>>830 例外処理は考慮してない。
#include<stdio.h>
#include<string.h>
char s[64];
int word[64];
int main(void){
char tmp[64];
int i, offset;
fgets(s,64,stdin);
for(i = offset = 0; sscanf(s+offset,"%[^ .\n]%*c",tmp) == 1; i++) {
word[i] = strlen(tmp);
offset += word[i] + 1;
}
return 0;
}
839 :
830 :2005/11/26(土) 19:46:51
>>838 様。
ありがとうございました!
最後に一つだけ教えてください。scanf中の
sは配列、offsetはint型関数でsscanfの第一引数は
配列型の指定が必要ですが、これは配列のアドレス
に+offsetしているのですか?
このsscanfは戻り値を返す判定のみでの使用ですよね?
荒れる前に、去れ。 お前に必要なのは、とりあえず入門書だ。
昨日からウェブを回りながら独学でC言語のことを勉強し始めたのですが、 初心者におすすめのC言語入門書というのはないでしょうか? まだfor if辺りまでしか読んでません
ローカルルールも読めない人にすすめられる本は知らんよ
ビューア使ってるんでローカルとか読んでなかった 明日帰りによさそうなの適当に買ってみる
どうぞご自由に無駄金使って自己満足してください。
何で無駄に煽るかな
心が狭いから
848 :
デフォルトの名無しさん :2005/11/28(月) 00:14:55
やさしいC Cの絵本 プログラミング言語C ANSI規格準拠 第2版(読めるならな)
Visual Studio theSpoke Premium ver.2003って今でも買い? 2003って古い気がしてならないんだけど
>>849 2005Proがタダでもらえます(要登録
なんでこのスレで聞くんだろうな
852 :
デフォルトの名無しさん :2005/11/28(月) 18:13:22
作成したプログラムの計算量を比較したいのですが、 ループの回数がマチマチで単純にオーダーを取ることでは比較しづらい という現状です。 コンパイラのコマンドやソフトウェアで計算量を測れませんか?
>>852 測れる環境があるデバッガはありますよ。
854 :
852 :2005/11/28(月) 18:34:13
>>853 すみませんが、そのデバッガは何処で手に入るか、
もしくは名称を教えていただけませんか?
>>854 あなたの環境もわからないのに教えても無意味ですよ。
856 :
デフォルトの名無しさん :2005/11/28(月) 18:58:40
普通はプロファイラを使うと思うんだが? デバッガでそんな事出来るのあるのか?
858 :
852 :2005/11/28(月) 20:28:10
お二方共コメントありがとうございます。 無知で申し訳ありません。 どちらにせよcygwinにプラグインする形をとることはできるのでしょうか?
859 :
デフォルトの名無しさん :2005/11/28(月) 21:39:05
どなたかエロイ人、お足得手下さい。 中一のがきんちょがゲームばかりやって、テストで2点とか 超パープリンな点数をとってきます。 で、ピアノが弾けるので芸無関係の業界へ進ませようと思ってます。 そこでCなんですが、VISUAL以外のただのCって売っているんで しょうか?何処で買えば?それともVisualCが主流なんですか? また、厨房向けの入門書もいいのがあったらご教授下さいませ。
>> 858
「cygwin gcc gprof」でぐぐれ
>>859 質問するときは奇を衒わず真っ当な文章を書こうな。
とりあえず ピアノが弾ける→ゲーム関係 ってのが意味不明。
>>859 ピアノが弾けるのならピアニストになれよ。
>>859 自己紹介"己"。
低脳人間を設定することで別の人間に仕立て上げる。
最低ではないが最悪だ。
言の端、普く全ての尽くが裏目に出る。
864 :
859 :2005/11/28(月) 22:07:42
>>860 >とりあえず ピアノが弾ける→ゲーム関係 ってのが意味不明。
ゲーム音楽の作曲アレンジとかをやればと思って。
>>861 >>862 いじめちゃいやん。
あふんばかん。
狂言はダメですらい。
・・・ゴクリ
もちろん普通にデジタル作曲・編集はできるだろ?
>>864 いや、だからゲーム音楽と絞っているか理解できない。なんの作曲家でも演奏家でもいいだろうに。
それはともかく音楽とプログラミング言語Cにはなんの関係もない。
料理人とレストラン経営の違いと同じぐらいの違いがある。
while Q≠0 do はQが0でないとき繰り返すんですよね? では、Q≠0から一度Q=0になり、再びQ≠0になったとき 終了させるにはどうすればいいですか?
>>868 while (Q != 0) {
if (Q == 0) {
while (Q == 0) {
hoge;
}
break;
}
}
これでどうよ
ってかwhile ~ doってpascalの構文じゃね?
>>859 876の言う通りゲーム業界に作曲系で入りたいのならCの知識は不要。
が、音屋さんの仕事って最初はループ再生用のカットとかノイズ低減とかで、
作曲アレンジなんておいしい仕事がくることは下手すると一生ないぞ。
音大くずれのゲーオタ連中と張り合っていける自信があるならどうぞいらっしゃいな。
871 :
870 :2005/11/28(月) 23:39:34
*おおっと* 未来の876さん失礼いたしました。867さんの間違いでしゅ。
バブルソートの計算量を削減するプログラムらしいのですが、★に何が入るか分かりません。 ご教授お願いします。 for(i=n-1;i>=2;i--){ sentinel=0; for(j=0;j<i;j++) if(a[j]<a[j+1]){ swap(&a[j],&a[j+1]); sentinel=1; } if(★) break; }
for(i=n-1;i>=1;i--){ sentinel=0; for(j=0;j<i;j++) if(a[j]<a[j+1]){ swap(&a[j],&a[j+1]); sentinel=1; } if(★) break; } でした;
>>869 ありがとうございます。明日先生に見せてきます!
hogeって何ですか?すいません。これってpascalなんですか?!
はてなダイアリーより hoge 日本の情報処理技術者が替え玉記号のように利用することが多い文字列。情報処理の技術ではメタ構文変数(Metasyntactic variable)とも呼ばれる。 つまり「hoge」と書いてあったら「必要なほにゃらかに置き換えて使ってください」というちょめちょめになる。
>>873 sentinel == 0 じゃねーの。
877 :
デフォルトの名無しさん :2005/11/29(火) 15:23:42
∧_∧ (´・∀・`) ハーイ ( ⊃┳⊃ ..(_)/⌒ヽ ⊂二二二( ^ω^)二⊃ | / ブーン ( ヽノ ノ>ノ 三 レレ
アンケートみたいに質問の答えをまた質問にする方法教えてください! 激初心者ですみません
>>873 そういうのはsentinelとは言わないと思うのだが、その問題出したのはどこのどいつだ。
linuxでプログラミングを勉強しようと思ってるのですが、 CとC++どちらにすれば良いか迷っております。 どなたかアドバイス下さい。
883 :
デフォルトの名無しさん :2005/11/30(水) 13:31:08
質問します。 ブルートフォースクラックとかプログラムはどういう仕組みで動いてるのか勉強したくて質問しました。 たとえば パスワードが34ieの四文字英数字だったとします。 1から順に4文字を生成してるのはどういう仕組みなんでしょうか? ただ単にそのまま四個のfor文でくるくる回してるんでしょうか? 具体例とかあったらうれしかです。
スタックのLIFOとFILOってのは同じですか?
スタックですらないのかよ!
オブジェクト指向って何? クラスって何? メソッドって何? ↑調べるとなんかループするし・・・orz
>>889 C言語のスレよりふさわしい所で聞けやボケ
891 :
デフォルトの名無しさん :2005/11/30(水) 18:40:45
出力結果をテキストファイルに保存する方法を教えてください。 よろしくお願いします。
>>891 その出力が標準出力ならばリダイレクトでできる。
その出力がGUI上ならばコピペでできるかもしれない。
いずれにしろ、環境がわからなくては詳しくはかけない。
尚、ファイルに出力したいならばfopen()、fprintf()、fclose()などを調べよ。
894 :
デフォルトの名無しさん :2005/11/30(水) 20:39:28
>>892 >>893 解答ありがとうございます。
コマンドプロンプトに標準出力しています。
リダイレクトで調べてみます。
895 :
デフォルトの名無しさん :2005/11/30(水) 21:02:17
キーボードから文字列を受け取り、改行のみが入力された場合に、 ループを抜けるようにプログラムしたいのですがうまくいきません。 buffer[20]; while(buffer[0]!='\n) { scanf("%s",buffer); } このようなプログラムを作ってみましたが、 これではscanfが改行だけの入力だけでは、受け付けてくれないですし、 getche()とforループの組み合わせでもよい方法が浮かびません。 何かよい方法があれば教えてください。よろしくお願いします。
>>894 リダイレクトは大抵のOSで "> ファイル名"と書く。
つまり、"プログラム名 > ファイル名"と書けばいい。
OSによっては'%'だったり'|'だったりする希ガス。
>>895 fgets()で入力し、sscanf()で変換するのが常套手段。
#あ、その例ではsscanf()するまでもないや。
899 :
デフォルトの名無しさん :2005/11/30(水) 21:32:04
>>895 返答ありがとうございます。
恐縮なんですが、fgets()で入力し、sscanf()で変換するというのがいまいちわかりません^^;
fgets()は、ファイルから1行呼び出してくる関数だったと思うんですが、
詳しく教えてもらえないでしょうか・・・。
900 :
デフォルトの名無しさん :2005/11/30(水) 21:39:22
>>898 だからそういうOSがあるんだってばさ。
>>899 fgets()でもstdinを指定すれば標準入力から読める。
>>899 while(scanf("%s",buf)!=1);で十分だろ
903 :
デフォルトの名無しさん :2005/11/30(水) 22:31:47
>>896 出力結果を保存することができました。
ありがとうございました。
904 :
デフォルトの名無しさん :2005/11/30(水) 23:40:58
883ですが ジョンザリッパーがどんな感じか聞いているんです。
バックスラッシュの出し方、教えてください。
\\
908 :
デフォルトの名無しさん :2005/12/01(木) 00:17:06
正の整数を入力し、その個数だけ*を連続して横に並べて出力するプログラムを作成せよ。 ただしwhile文を用いること。 というプログラムはどうやって作ればいいのでしょうか。。。
おみくじなら
>>910 フォントを欧州のやつに変えてみれ。
日本語の\はバックスラッシュと同じ文字コード。
>>908 入力された整数の分だけ、While回せ
ループの中でprintf("*");
913 :
デフォルトの名無しさん :2005/12/01(木) 00:35:15
srand()で初期乱数を時間から持っていた数字で決めて、 rand()で初期乱数から乱数を引っ張る っていう結構一般的な 乱数発生関数を作ったんですが、もっと 散り散りになる乱数の作り方って ないでしょうか?
>>913 つ[Mersenne Twister]
915 :
デフォルトの名無しさん :2005/12/01(木) 00:37:49
>>905 初心者スレじゃないんかよ!! ったくわからないならわからんって言えよww
>>912 ありがとうございます!!なんとなくできました!!
917 :
デフォルトの名無しさん :2005/12/01(木) 00:44:42
>>883 >>904 >>915 (ここはジョンザリッパーの初心者スレじゃないですよ。
ブルートのアルゴリズム解析スレでもないですよ。
質問者の態度っていうものもあると思いますよ。
回答者が出てくれるまで、気長に待ったほうが得策だと思いますよ。
それが待てないのならば、)ソースを読め
>>914 おぉ なかなか面白そうな。
ヒントありがとうございます。
919 :
デフォルトの名無しさん :2005/12/01(木) 02:11:44
なんとか空白で文字幅を調節して 掲示板に書き込む時に見栄えを良くしたいのですが そのようなアルゴリズム(プログラム)はありますか? 左側の文字列は共に9文字で単純に6文字の空白を 入れただけでは次のようになってしまいます・・・ 【例】 あっいaIU++幅 ここに書く tkahuanたl ここに書く
921 :
デフォルトの名無しさん :2005/12/01(木) 02:22:43
>>919 固定長フォントで全角のみを使うwww
まあ実際、文字の位置あわせというのは簡単なようで、結構難しい。
922 :
919 :2005/12/01(木) 03:03:50
>>920 いや例えばこの掲示板に書き込むだけなら同じフォントですよね?
>>921 そうですか・・・
左側の列は予め決まった単語ではないので
どうしても計算してだす必要があるんです・・・
923 :
デフォルトの名無しさん :2005/12/01(木) 03:33:34
924 :
919 :2005/12/01(木) 03:59:30
AA関連のサイトにでも行って、定番フォントの幅を調べて文字ごとの画素数のテーブルを作り、 それを使って計算すればやってできないことはない。 が、かなり面倒だとは思う。
926 :
919 :2005/12/01(木) 04:23:18
>>925 やっぱりそこまでしないとできないものですか・・・
ヤフーで検索してもそれらしきものがでてこないし・・・
あ 1
あ11
↑今気づいたけど、半角スペースと半角数字の1の幅が違うんですよね・・・
正直これには参った・・・
やっぱり完璧にするのは無理かなぁ
927 :
デフォルトの名無しさん :2005/12/01(木) 04:33:18
>>926 プロポーショナルフォントは、すべての文字の文字幅は異なると思ったほうがよい。
だから計算できたとしても、ぴったりではなくて近似なんだよね。
WinAPIのGetCharacterPlacementやGetTextExtentPoint32という関数で文字列の幅の計算が
できるようです。HDCを渡さなくてはいけないんですけど。
しかも、 があったりね。
>>922 フォントはブラウザの設定で変し、
掲示板で書き込みできるのは文字情報のみで、
表示されるフォントの情報など存在しない。
そんなに位置合わせをしたいなら、
タグ入力可能な掲示板でtableタグで合わせろ。
夢がねぇ香具師だなぁ。 つーか、AAを否定されてもねw
932 :
デフォルトの名無しさん :2005/12/01(木) 11:25:54
Z1=2.5+3.2i Z2=1.3+0.4i この和と積を求めて、結果を打ち出すプログラムはどうなりますか? 自分でやってみたんですが、うまくいきません。 誰かわかる方教えてください。
934 :
デフォルトの名無しさん :2005/12/01(木) 15:19:43
mallocが理解できないのでお聞きします。 char *z; int a; z = (char *)malloc(a * 2 + 1); の様に使うみたいですが (char *)の部分がわかりません。(a * 2 + 1)の部分はa×2+1バイト用意するってことですか?
>>936 mallocはvoid*型の値を返すから、char*型にキャストしてからzに入れないと
コンパイラに怒られる。
そんでもって(a * 2 + 1)バイト確保してる
>>937 イマイチわかりませんが、取りあえず書いておけということですね
>>936 (型名)式
は式を指定した型に変換します。
この場合はchar*型(charへのポインタ型)に変換しているわけですね。
mallocはvoid*型を返し、void*型は代入時に自動的に(左辺のポインタ型に)型変換されるのでこのようなキャストは必要ありません。
可読性や安全性を考えると、むしろやめておいた方がいいでしょう
>>937 の2行目と3行目はC++の仕様です
>>934 その際とのどこにDISWINとやらがあるのか教えてくれ。
941 :
934 :2005/12/01(木) 17:50:18
ttp://hp.vector.co.jp/authors/VA018359/ ごめんなさいページのURL貼ったんですがTOPが表示されるっぽいですね
お手数ですが
下のタブの解析・考察(Hacking)→キーディスクチェック解析
→上から10行目の改造講座→初級05の「逆アンセブラを使ってみる2」です
めちゃくちゃ面倒くさいですね・・・すいませんorz
そこにあるAPIリストの作成なんですがXPではどこを指定したらいいのやら・・・
>>941 2kもXPも同じNT系。
だけどXPのデフォルトのインストールフォルダはC:\WINDOWS。
ということでC:\WINDOWS\SYSTEM32
943 :
デフォルトの名無しさん :2005/12/01(木) 18:15:42
質問です。 コンパイルをすると下のようなエラーメッセージが出てきます。 どうしたらいいのでしょうか? ―――――――エラーメッセージ――――――― Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland hello.c: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Fatal: ファイル C0X32.OBJ が開けません ―――――――――――――――――――――― と出てきます。
>>941 スレ違いになるけど、そういうフレームを使ったページは目的の場所で右クリックメニューから
プロパティを出すと中身のアドレスが得られるよ。
で、XPは知らんけどWin2Kと同じなんで内科医?
まぁ、どうなっても私ゃ知らんが。
946 :
934 :2005/12/01(木) 18:47:01
>>941 ありがとうございます!出来ました!
>>944 そんな方法あったんですね。次からそうします!
あとはdd拍子にいけるはずです。わざわざありがとうございましたm(_ _)m
魑魅魍魎
948 :
↑ :2005/12/01(木) 18:48:49
//演習3.6 #include<stdio.h> void main() { intmonth[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; intyy,mm,dd; intmonc,con=0; printf("Please input date (yyyy.mm.dd) ==> "); scanf("%d.%d.%d",&yy,&mm,&yy); if(mm > 0 && mm < 13) if((month[mm-1]+1)>dd){ for(monc=1;monc!=mm;monc++){ //printf("%d\n",con); con+=month[monc-1]; } con+=dd; } else printf("ERROR\n"); else printf("ERROR\n"); printf("Total %d days",con); } で//printf("%d\n",con);行のコメントをはずすと正常に動作するのですが、 コメントにしたり行を消したりすると正常に動作しません。 超初歩的な質問かも知れませんがよろしくお願いします。 開発環境はBorland C++ 5.5です。
//演習3.6 #include<stdio.h> void main() { int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; int yy,mm,dd; int monc,con=0; printf("Please input date (yyyy.mm.dd) ==> "); scanf("%d.%d.%d",&yy,&mm,&yy); if(mm > 0 && mm < 13) if((month[mm-1]+1)>dd){ for(monc=1;monc!=mm;monc++){ //printf("%d\n",con); con+=month[monc-1]; } con+=dd; } else printf("ERROR\n"); else printf("ERROR\n"); printf("Total %d days",con); } 見にくくてすみません。
よく見てないけど >scanf("%d.%d.%d",&yy,&mm,&yy); yy がふたつ。
ああああああぁぁぁぁぁぁ.....orz やってしまった・・・見落とし・・。orz 次からは注意します。
で、そのプログラムは結局なにがしたいのさ 年数を入力する必要はないし、仮に元日からの日数を求めるんであれば、 1月31日を指定したら62日と帰ってきそうなんだが。
//演習3.6 #include<stdio.h> void main() { int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; int yy,mm,dd; int monc,con=0; printf("Please input date (yyyy.mm.dd) ==> "); scanf("%d.%d.%d",&yy,&mm,&dd); if(mm > 0 && mm < 13) if((month[mm-1]+1)>dd){ if(yy%4==0 && yy%100!=0) month[1]=29; for(monc=1;monc!=mm;monc++){ con+=month[monc-1]; } con+=dd; } else printf("ERROR\n"); else printf("ERROR\n"); printf("Total %d days",con); } 完成しました。 入力した年月日を入力し、元日からの日数を求めるプログラムです。 年を入力する必要があったのは閏年の判定をする為です。
>>954 100年判定入れるなら400年判定入れないと2000年がおかしくなる。
細かいけどこうね if(yy%400==0 || (yy%4==0 && yy%100!=0))
957 :
956 :2005/12/02(金) 09:27:52
かぶった・・・
if(mm > 0 && mm < 13){ if(yy%400==0 || (yy%4==0 && yy%100!=0)) month[1]=29; if((month[mm-1]+1)>dd){ for(monc=1;monc!=mm;monc++){ con+=month[monc-1]; } con+=dd; } } お早いレスありがとうございます。判定の位置もおかしかったので修正 しました。これからも精進します。
>>959 長い未来を見据えず、mktime()で算出するのはいかが?(w
961 :
デフォルトの名無しさん :2005/12/03(土) 10:44:15
FreeBSDで下の式のグラフを書いて表示させたい。どうすりゃいいんだ f(x) = x*x ( x=-4, -3, ..., 0, 1, ..., 4)
gnuplot
ありがとう
964 :
国士 :2005/12/03(土) 14:18:55
僕もどしろうとなんですけど代入演算子ってなにかわかりますか?
もちろんだ
char a = '+' とかやったときのaが代入演算子。ようするに演算子を代入するもののことだ
任意の関数f(x)の x=n における微分係数を求めるにはどのような方法がありますか f(x),g(x),h(x)とあれば、diff_fx(float x),diff_gx( float x),diff_hx( float x)みたいに3つ作るくらいしか考えられませんでした diff_fx( float x) の内容は、手計算でf(x)の導関数を求めて、それを書き込んでというどうしようもない状態です(ノд`)
>>968 あらかじめ関数が決まっているなら精度的にはそれが一番いい方法。
>>968 関数決まってないなら
f'(c) = lim[h→0]{(f(h+c) - f(c))/h}
を使って、h=0.000000001とでもしてやるしかないんじゃまいか?
>>969 確かにこれでも問題なく動くのですが、汎用性が全くないなぁと思いまして
関数変える度に、導関数も求め直すのも結構手間ですし
>>970 定義に従って微分していくということですか
試してみます
ありがとうございました
>>970 それは小さすぎ。普通の多項式でもひどい誤差になる。
中心差分でも10の-5乗くらいが限度かと。
近似式ってもんを知らない馬鹿しかいないんだな
これがCの質問だと思ってる奴の脳味噌じゃその程度か。
977 :
デフォルトの名無しさん :2005/12/04(日) 15:45:41
キーボードから「c」を入力した時に「OK!」、それ以外の時には「NG!」と出力するプログラムはどう書けばいいですか?
if( キーボードから入力された文字 == 'c' ) puts("OK!"); else puts("NG!");
979 :
977 :2005/12/04(日) 16:17:46
else if文でお願いしますorz 自分ではこう書きましたがダメでした。 #include<stdio.h> int main(void) { int x; scanf("%c",&x); if(x=='c'){ printf("OK!\n"); } else{ printf("NG!\n"); } return 0; }
980 :
デフォルトの名無しさん :2005/12/04(日) 16:38:07
>>979 intで宣言して%cで受けるのはおかしいだろがッ
とりあえずchar xに汁
981 :
977 :2005/12/04(日) 16:58:59
>>980 出来ました。
でも、「cc」でも「OK!」と出てしまいます。
>>981 ・・・・scanfが何してるか考えてるか?
983 :
977 :2005/12/04(日) 17:30:52
>>982 キーボードから数値を取り込む関数?
すみません。激初心者ですorz
985 :
977 :2005/12/04(日) 17:42:37
char x; scanf("%c",&x); if(a=='c') この辺が間違ってる様な希ガス
986 :
977 :2005/12/04(日) 17:47:33
char x; scanf("%c",&x); if(x=='c') こうか
char型は文字一文字が入るサイズのデータ型です。所謂1バイト。これは全処理系共通です。 scanfの%cは文字一文字を受け取ることを示します。 つまり char c; scanf("%c",&c); は標準入力からcに一文字入れるということです。
989 :
977 :2005/12/04(日) 17:55:26
#include<stdio.h> int main(void) { char x; scanf("%c",&x); if(x=='c'){ printf("OK!\n"); } else{ printf("NG!\n"); } return 0; } ccと入力してもON!にするにはどうしたら?
990 :
977 :2005/12/04(日) 17:56:16
↑NG!ですorz
#include <stdio.h> #include <string.h> int main(void){ char c[3]; fgets(c,sizeof(c),stdin); if(c[strlen(c)-1]=='\n') c[strlen(c)-1]='\0'; else{ puts("NG"); return 0; } if(!strcmp(c,"c")) puts("OK"); else puts("NG"); return 0; } 冗長だと思ったら改行文字除去削って比較文字列に改行文字加えれ
993 :
977 :2005/12/04(日) 18:40:46
>>991-992 すいません。そこまで習っていません。
習ったのは
printf関数
scanf関数
if文
else if文
for文
等です。
これらで
>>977 は出来るはずなんだけどなぁ
>>993 配列は習った?
習っていないなら2文字以上の入力は考えなくてもいいはずだ
995 :
977 :2005/12/04(日) 19:17:21
>>987 乙
でも,そしたら993のような香具師はスルーされるかもな
初心者は2chじゃなくて,K&R読んで勉強汁ってことか
>>993 これでおk
#include<stdio.h>
int main(void)
{
char x,y;
if((scanf("%c%[^\n]%*c",&x,&y)==1)&&(x=='c'){
printf("OK!\n");
}
else{
printf("NG!\n");
}
return 0;
}
1000 :
デフォルトの名無しさん :2005/12/04(日) 19:28:04
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。