C言語なら俺に聞け(入門篇) Part 4
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/11/09(木) 00:31:01・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 3
http://pc8.2ch.net/test/read.cgi/tech/1160682950/
過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/
関連スレ
くだすれC言語(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1153542424/
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/
0698デフォルトの名無しさん
2006/11/24(金) 13:28:41man sed
0699デフォルトの名無しさん
2006/11/24(金) 13:28:58>while(*fp[pt] != "A-Z" || *fp[pt] != "a-z" ){
ローマ字以外の時だけ繰り返すって意味なら
while !((*fp[pt] >= 'A' && *fp[pt] <='Z') || (*fp[pt] >= 'a' && *fp[pt] <= 'z') ){
こんな感じになる
0700694
2006/11/24(金) 13:31:04*fpはFILE型のポインタでchar型でなく、int型としてしか取り扱えない
ようなエラー内容。fopen関数でfpに変更したいファイルを'r+'で
オープンしています。
695の内容はsetの次の数字以外の文字が来たときにはプログラムが終了
するような意図を持って記入しました。英文字が来たら終了の意図です。
自信ないんですが。
0701デフォルトの名無しさん
2006/11/24(金) 13:32:24while(!isalpha(*fp[pt]))
0702デフォルトの名無しさん
2006/11/24(金) 13:33:09直接 *fp or fp[] で操作する と想像したお前に完敗
0704デフォルトの名無しさん
2006/11/24(金) 13:35:570705デフォルトの名無しさん
2006/11/24(金) 13:46:02それでもコンパイルは通るだろ。
char **fpとかじゃねぇの?
0706694
2006/11/24(金) 16:56:30レスくれた人、有難う。
勘だらけで内容くちゃぐちゃだけど、
結果オーライ。
0707デフォルトの名無しさん
2006/11/24(金) 17:19:43終了したか監視したいんだけども
どうやるんざますの?
0708デフォルトの名無しさん
2006/11/24(金) 17:34:33>>1
0709デフォルトの名無しさん
2006/11/24(金) 17:34:550710ぴゅあ
2006/11/25(土) 00:29:31あちしの場合はwhile (1)よりfor ( ; ; )を好んで使いますね
賢いコンパイラならwhile (1)をfor ( ; ; )として解釈してくれそうでもあるけど
なんか「キメェ」って感じなので。。。(使い方合ってます?)
(while(1)は、毎回「1だよね」って確認してくれてそうな…)
#define forever() for ( ; ; )
とかすることもあったりするけど(色んなコードを見てるとそんな風にしているのも多くあったりする?し)
サラッと書いて済ますときは(特に)for ( ; ; )だったりですけど
実際while(1)を使うかfor ( ; ; )を使うかはそのときの気分?かな
圧倒的にfor ( ; ; )の方が多いのは間違いないけど
仕様もない話ですが。。。
0711デフォルトの名無しさん
2006/11/25(土) 00:37:14while(1)を最適化しないコンパイラなんて糞コンパイラだ。
for(;;)はANSIが無限ループのために規格化した書き方だ。
0712デフォルトの名無しさん
2006/11/25(土) 00:41:07for ( ; ; ) ; /* 悲しそう */
while (1) ; /* ょぅι゛ょの割れ目?卑猥です */
0713デフォルトの名無しさん
2006/11/25(土) 08:02:35while(1) はもう while(1) というパターンとして認識されてるから、正直どっちでもいいと思うぜ。
0714デフォルトの名無しさん
2006/11/25(土) 09:15:280715デフォルトの名無しさん
2006/11/25(土) 09:51:26以外のファイルってなんなの?
.makと.objと.tdsなんだけど。
教えてくださらんか。
0716デフォルトの名無しさん
2006/11/25(土) 09:53:30C言語で他の実行ファイルを実行させたい場合、
どういう風に記述すればいいのだろうか。
0717デフォルトの名無しさん
2006/11/25(土) 09:56:35while (1==1)
だな。
0718デフォルトの名無しさん
2006/11/25(土) 11:08:35.makはコンパイル時には作られないだろう
BCCDeveloperかなんか使ってるんじゃねーの?
ちなみに.makはメイクファイルといってコンパイルやリンク時の手順を記述したもの
自分で書いたりIDEが吐いてくれたメイクファイルを元にコンパイル等を実行する。
tdsは何か忘れた
.objは純粋にコンパイルしたときに作られるオブジェクトファイル
本来EXEを生成するには
・hoge.cをコンパイルしてhoge.objを生成
・hoge.objと必要なライブラリ等をリンクしてEXE生成
という大まかに分けて2つの手順を踏む必要があるが、
bccは-cオプションをつけない限り、リンクも自動的にやってくれるようになっている
間違ってるかもしれないけど、大体こんな感じ
0719715
2006/11/25(土) 11:32:22回答どうもありがとう!
0720ぴゅあ
2006/11/25(土) 13:21:20system関数周りとかexec系の関数辺りとかを見てみれば
>>714
当然パターンとしてコンパイラは認識する筈だけど
中身(式)なしのforがどうなるかだろうけど
アセンブラをずっとやっているときにCが出てきて
アセンブラからCを中から見て理解したけど(特にポインタとか)
中身なしのforは中身なしのコードで出てきてた記憶はあるけど
いずれにしても余程変なことでもしてなきゃ
好みで選んでいいだろうと思うけど
>>711
ANSI Cが定められたのを知っても特に興味も沸かなくて
気にしてこなかったけど
あちしがずっと好んでだけで使ってきてたことを
適切であっただろうとわざわざ立証してくれてありがとう
0721デフォルトの名無しさん
2006/11/25(土) 13:27:590722デフォルトの名無しさん
2006/11/25(土) 13:43:27?
0723デフォルトの名無しさん
2006/11/25(土) 13:52:57http://pc8.2ch.net/test/read.cgi/tech/1162999861/l50
Cなら俺に聞け(応用編)
http://pc8.2ch.net/test/read.cgi/tech/1163246166/l50
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/l50
くだすれC言語(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1153542424/l50
渡辺篤史のGoogle Code Search探訪
http://pc8.2ch.net/test/read.cgi/tech/1160188096/l50
どこに質問していいのか分かりません
ビットシフトについてなんですが・・・
0724デフォルトの名無しさん
2006/11/25(土) 14:10:210725デフォルトの名無しさん
2006/11/25(土) 14:34:11夏休みはまだ早いぞ
0726デフォルトの名無しさん
2006/11/25(土) 15:22:470727デフォルトの名無しさん
2006/11/25(土) 19:40:35ぐしゃぐしゃです。
助言くれーー。
0728デフォルトの名無しさん
2006/11/25(土) 19:42:030729デフォルトの名無しさん
2006/11/25(土) 19:42:32#define NUM 500
int main(){
FILE *fp;
int ch;
int chx[NUM]={0};
int i=0;
0730デフォルトの名無しさん
2006/11/25(土) 19:43:09puts("読み取りオープン失敗");
else{
puts("元の内容");
while((ch=fgetc(fp)) != EOF){
chx[i]=ch;
putchar(chx[i]);
i++;
}
}
putchar('\n');
0731デフォルトの名無しさん
2006/11/25(土) 19:44:09puts("配列chxの内容");
for(i=0;i<NUM;i++)
putchar(chx[i]);
getchar();
return 0;
}
0732727
2006/11/25(土) 19:45:040733727
2006/11/25(土) 19:47:510734727
2006/11/25(土) 19:58:04設定配列数オーバーしても関係ないんですね。
>>720どうもありがとう、ぐぐってみます!
0735デフォルトの名無しさん
2006/11/25(土) 20:06:58iがNUM以上になるのを何故放置するのか?
0736デフォルトの名無しさん
2006/11/25(土) 20:08:50#include <stdio.h>
#define SIZE 1000
main(){FILE *fp; int i, c, chx[SIZE];
if((fp=fopen("C:\\tools\\ten.bat","r")) ==NULL) puts("どんまい");
else {puts("もとの");
for (i=0; i<SIZE && (c=fgetc(fp))!=EOF; i++) putchar(chx[i]=c);
chx[i]='\0';}
getchar(); puts("\nはいれつのなか");
for (i=0; i<SIZE && chx[i]; i++) putchar(chx[i]);
getchar();return 0;}
0737デフォルトの名無しさん
2006/11/25(土) 20:25:040738デフォルトの名無しさん
2006/11/25(土) 20:26:480739デフォルトの名無しさん
2006/11/25(土) 20:28:00#define SIZE 1000
for (i=0; i<SIZE
chx[i]='\0';
’SIZE’以上のファイルだと i は1000になって chx のサイズオーバー
0740デフォルトの名無しさん
2006/11/25(土) 20:59:53>>737
ゴメンなさい。反省してます。
0741716
2006/11/25(土) 22:12:56こんな感じにやって駄目でした。
#include <stdio.h>
#include <process.h>
int main(){
execv("C:\\tools\\ten.bat",NULL);
getchar();
return 0;
}
ヒントいただけないでしょうか
0742デフォルトの名無しさん
2006/11/25(土) 22:30:570743716
2006/11/25(土) 22:57:04#include <process.h>
int main(){
system("C:\\tools\\ten.bat");
getchar();
return 0;
}
あっさりできたw
どうもありがとうございます。
0744デフォルトの名無しさん
2006/11/26(日) 01:26:501個の構造体では出来たのですが、一つのファイルに二つ以上入れたとき、一つ目のデータが破棄されてしまうのです。
具体的には
1、no番目の構造体データをfseek(fp,no*sizeof(str),SEEK_SET)後fwrite(&str_a,sizeof(str),1,fp)で入力。
2、別のnoについて同様に入力。
3、確認の為、no番目のデータををfseek(fp,no*sizeof(str),SEEK_SET)後fread(&str_b,sizeof(str),1,fp)でstr_aにコピー。
4、printfでstr_bの中身を見ると、0になっている。
コンパイルエラーは起きないし、もちろんメモリ保護違反等も起きてないのですが…
0745デフォルトの名無しさん
2006/11/26(日) 01:28:58ソースコードを晒して
0746デフォルトの名無しさん
2006/11/26(日) 01:30:59んでstr_bはどこで読み込んでんの?
0747デフォルトの名無しさん
2006/11/26(日) 01:48:46{
int no,sel;
str_a alpha;
FILE *fp;
printf("plz input no\n");
scanf("%d",&no);
printf("plz input RorW(W=1,R=2)\n");
scanf("%d",&sel);
switch (sel){
case 1:
fp=fopen("data.bin","wb");
fseek(fp,sizeof(str_a)*no,SEEK_SET);
printf("plz input a,b,c\n");
scanf("%d%d%d",&alpha.a,&alpha.b,&alpha.c);
fwrite(&alpha,sizeof(str_a),1,fp);
break;
case 2:
default:
fp=fopen("data.bin","rb");
fseek(fp,sizeof(str_a)*no,SEEK_SET);
fread(&alpha,sizeof(str_a),1,fp);
break;
}
printf("%d\t%d\t%d\n",alpha.a,alpha.b,alpha.c);
fclose(fp);
return 0;
}
上で書いたまんまのソースはいじりまくってしまったので申し訳ないですけど、↑で。
もちろん、同じ状況である事は確認しました。
0748デフォルトの名無しさん
2006/11/26(日) 01:54:52typedef struct
{
int a,b,c;
} str_a;
です。
0749デフォルトの名無しさん
2006/11/26(日) 01:54:54noはゼロじゃなくていきなり 1 から初めてんの?
多分最初のfseek()が失敗してるよ。戻り値をみてみ。
0750デフォルトの名無しさん
2006/11/26(日) 02:02:34期待した動作と違うって事だろうから、エスパー解答
fp=fopen("data.bin","wb");
↓
fp=fopen("data.bin","r+b");
0751デフォルトの名無しさん
2006/11/26(日) 02:04:05no=0とno=1でfseekの戻り値見てみましたが、0でした。
fseekの引数でnoを(no-1)にしてnoを1と2で試してみましたが、やっぱりno=1を読むと0 0 0になってしまいました。
戻り値の意味が間違ってるならごめんなさい。
0752デフォルトの名無しさん
2006/11/26(日) 02:07:130なら成功してますね。
>>750
あっそういう事か。ファイルを上書きして消してしまってるという事ね。
元のファイルを残したいならr+bだな。
0753デフォルトの名無しさん
2006/11/26(日) 02:11:07それで試したら無事表示できました、ありがとうございます!
オープンモード、もう一度勉強しなおしてきます。
>751
わかりづらくて申し訳ありませんでした。
上書きはwbやwb+とはまた別の書き方なんですね…
こんな深夜にお付き合い頂き、ありがとうございました。
0754デフォルトの名無しさん
2006/11/26(日) 10:26:000755デフォルトの名無しさん
2006/11/26(日) 10:33:40初心者なんでptagmaが何かわかりません。
わかりやすく説明してくださいませんか?
0756デフォルトの名無しさん
2006/11/26(日) 10:36:230757デフォルトの名無しさん
2006/11/26(日) 13:23:19内容をみるのでしょうか。何か専用のツールがあるのかなあ。
こんな感じのファイルです。
MAKEDEV-3.1.0-19.src.rpm
ご存知の方教えてください。
スレちがいならすまん。
0758デフォルトの名無しさん
2006/11/26(日) 13:29:48それはインストール用パッケージだ。詳しくは犬板でどうぞ。
>>755
>754はpragmaと言いたかったのだろう。
要は、構造体のメンバ間に埋め草が必要になる可能性を排除しておけと言うことだ。
0759デフォルトの名無しさん
2006/11/26(日) 13:33:21モード,動作,ファイルがないとき,ファイルがあるとき
r,読み込み専用,エラー,開く
w,書き込み専用,作る,クリアする
a,追記専用,忘れた,開いて末尾に移動
r+,読み書き,エラー,開く
w+,読み書き,作る,クリアする
a+,追記部で読み書き,忘れた,開いて末尾に移動
0760デフォルトの名無しさん
2006/11/26(日) 13:42:00#ptagma ではなく #pragma
C言語の範疇では定義されていない部分について、コンパイラに対して
特殊な指示を出すためのもの。
VC++なら pragmaだったけど、他のコンパイラなら違ってるかも。良く知なくてすまん。
C言語の学習を始めたばかりなら、まだpragmaとかは意識しないほうがいいかも。
ある程度基礎ができてきてから出いいので、
変数をメモリに割り当てるときの境界調整だとか、
構造体のメンバの間に詰め物がされる場合があるとか、
そういう話も調べて見るといいかも。
以下のページの説明が分かりやすそう。
ttp://mag.autumn.org/Content.modf?id=20050430014843
とりあえず、今やっている構造体のメモリ内容をファイルに書き出す&読み込む
というのは、同じ環境でやっている分には使えるけど、
書き出したファイルを別の環境で読み出す上手く行かないことがあるというのを
知っていればいいと思うよ。
0761デフォルトの名無しさん
2006/11/26(日) 13:42:020762デフォルトの名無しさん
2006/11/26(日) 13:50:48中途半端にpragmaどうこうは気にしなくてもいいかもしれんけど。
0763デフォルトの名無しさん
2006/11/26(日) 13:51:08759 宛て
0764デフォルトの名無しさん
2006/11/26(日) 15:58:571以上の値だったらマイナスをつけて返す、
-1以下の値だったらプラスをつけて返す関数を作成したいのですが、
最上位ビットを確認し、反転する一番いい書き方ってどんなんでしょうか?
0765デフォルトの名無しさん
2006/11/26(日) 16:01:15{
return -x;
}
0766デフォルトの名無しさん
2006/11/26(日) 16:12:31最上位ビットを反転しても符号が逆でも絶対値が同じにはならん。
>>764が結局何をしたいのか書かないから
>1以上の値だったらマイナスをつけて返す、
>-1以下の値だったらプラスをつけて返す関数を作成したいのですが、
の部分より>>765が正解のように思える。
0767デフォルトの名無しさん
2006/11/26(日) 16:25:27ってなんだよ〜。くそorz
0768デフォルトの名無しさん
2006/11/26(日) 16:35:31クリアじゃなくフィルだな
int i;
for (i=0; i<10;i++) {
a[i]=0;
b[i]='a';
}
0769767
2006/11/26(日) 16:40:13おっと>>768ありがとうございます。
0770デフォルトの名無しさん
2006/11/26(日) 18:17:24そのときmainの中にある配列atai[10]の値をkaikiに渡して,
kaiki内で計算した結果のkotae1,kotae2という二つの変数をmainに返したいのですが、
どのように書いたらいいのでしょうか?
0771デフォルトの名無しさん
2006/11/26(日) 18:20:46void kaiki(int n, int* kotae1, int* kotae2)
{
...
}
main()
{
int atai[100];
int kotae1, kotae2;
...
kaiki(atai[10], &kotae1, &kotae2);
...
}
0772デフォルトの名無しさん
2006/11/26(日) 18:45:02int kotae1;
int kotae2;
};
struct kotae kaiki(int n, int const * atai)
{
struct kotae rtn;
//
rtn.kotae1 = 0;
rtn.kotae2 = 0;
//
return rtn;
}
int main()
{
int atai[100];
struct kotae kotae = kaiki(sizeof(atai) / sizeof(* atai), atai);
printf("kotae1:%d, kotae2:%d\n", kotae.kotae1, kotae.kotae2);
return 0;
}
0773デフォルトの名無しさん
2006/11/26(日) 21:56:15Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm
0 23 0 374.2 0 0 0 0 0 0 0 0 0
1 22 ・・・
があるのですが、2行4列目の数字だけをfscanf等で取り込みたいです。
このようなエクセルファイルが365個あり、順々に2行4列目だけをP[i]へ格納していこうと思うのですが、読み込みの部分が上手くいきません。
よろしくお願いします。
0774デフォルトの名無しさん
2006/11/26(日) 22:04:59その365個のファイルは、ファイル名に規則性があるの?
それとも、全部、手入力?
0775デフォルトの名無しさん
2006/11/26(日) 22:22:55年間データで
1_1.xls〜12_31.xls(1月1日〜12月31)
です。
0776デフォルトの名無しさん
2006/11/26(日) 22:37:36読みこむ部分だけ。
一行256文字以下で、二行目が整数、整数、整数、実数の並びになっているとして。
int readVal(const char *filename, double* d)
{
FILE *fp;
char line[256];
int dmy1, dmy2, dmy3;
fp = fopen(filename, "r");
if (fp == NULL)
return 0;
if (fgets(line, sizeof line, fp) == NULL)
return 0;
if (fgets(line, sizeof line, fp) == NULL)
return 0;
if (sscanf("%d %d %d %lf", &dmy1, &dmy2, &dmy3, d) != 4)
return 0;
fclose(fp);
return 1;
}
0777776
2006/11/26(日) 22:39:50↓まかせた。
0778デフォルトの名無しさん
2006/11/26(日) 22:40:45来週もよろしく頼むぞよ
0779デフォルトの名無しさん
2006/11/26(日) 22:46:58fgets(s, sizeof(s), fp),
fgets(s, sizeof(s), fp);
P[i] = s[3]-'0';
で良いんじゃね?
0780デフォルトの名無しさん
2006/11/26(日) 22:54:270781デフォルトの名無しさん
2006/11/26(日) 23:04:28テキストとしての4列目なのではなく、4セル目なんでね?
>>776
何故%*dとせずにダミーに格納する?
>>775
xlsファイルを読むのは途方もなく面倒なわけだが、csvか何かに変換できないのか?
0782デフォルトの名無しさん
2006/11/26(日) 23:46:01>>776の方法では駄目でしょうか?
もう少しで試せるので出来次第報告します。
0783デフォルトの名無しさん
2006/11/26(日) 23:48:57拡張子ではなく内容の問題
書式等の情報が含まれるからめんどくさい
0784デフォルトの名無しさん
2006/11/26(日) 23:54:55行間は勿論改行です。
0785デフォルトの名無しさん
2006/11/26(日) 23:58:56データ保存する際にtxtとかにするって意味か
ファイル名の変更で拡張子変えるって意味かと思った
0786デフォルトの名無しさん
2006/11/27(月) 00:28:19スイマセン、そういう意味です。
伝わりにくい言い方で申し訳ないです。
0787デフォルトの名無しさん
2006/11/27(月) 01:20:44とりあえず切り出したらどうだろ?
0788デフォルトの名無しさん
2006/11/27(月) 03:03:39#include <stdio.h>
#include <conio.h>
int main()
{
int a = -32769, b = 32768;/*コメント*/
printf("a = 15\nb = 20\n");
printf("a + b = %d\n", a + b);
printf("何かキーを押してください\n");
getch();
printf("End");
return 0;
これってVC++だとコンパイルできないようなんですが、BCCではコンパイルできてしまいます。何か理由ってあるんでしょうか。
0789デフォルトの名無しさん
2006/11/27(月) 03:06:44標準じゃないライブラリconioがあるかどうか。
0790デフォルトの名無しさん
2006/11/27(月) 03:15:57括弧が足りない。
0791デフォルトの名無しさん
2006/11/27(月) 03:18:25愛も足りないねぇ 標準で済むのに
0792デフォルトの名無しさん
2006/11/27(月) 03:22:00どの括弧が足りないんでしょうか?
それとコンパイルできないのが正しい形なんでしょうか?
0793デフォルトの名無しさん
2006/11/27(月) 03:29:23getch(); → _getch();
にすればコンパイルできるんじゃないかなかな。
0794デフォルトの名無しさん
2006/11/27(月) 03:39:150795デフォルトの名無しさん
2006/11/27(月) 03:40:57ニュートン法とか二分法とか
0796794
2006/11/27(月) 04:02:27具体的にはどうすればいいんですか?
まったくわからないので教えて下さい。
0797デフォルトの名無しさん
2006/11/27(月) 04:04:12ぐぐれよ
例えば平方根を求める場合
http://www.sm.rim.or.jp/~shishido/newton.html
これのx*xをsin(x)にかえて、2*xをcos(x)に変えるとか
■ このスレッドは過去ログ倉庫に格納されています