C言語なら俺に聞け(入門篇) Part 20
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/10/15(月) 22:34:33・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 19
http://pc11.2ch.net/test/read.cgi/tech/1190342593/
教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 97代目
http://pc11.2ch.net/test/read.cgi/tech/1191937213/
0153デフォルトの名無しさん
2007/10/18(木) 07:30:13現在の時刻: 7:28:12.80
新しい時刻を入力してください:_
と表示されます。
0154デフォルトの名無しさん
2007/10/18(木) 07:33:05.\time
.\time.exe
0155デフォルトの名無しさん
2007/10/18(木) 07:53:16ありがとうございます。実行できました。
0156デフォルトの名無しさん
2007/10/18(木) 08:48:38C言語作成当初からあったのでしょうか?
(自分の環境がC99な為、C89等他の環境でもビルドできるか知りたいです)
0157デフォルトの名無しさん
2007/10/18(木) 08:50:570158デフォルトの名無しさん
2007/10/18(木) 14:17:05大丈夫、C99でもできない。恐らくgccの拡張だろ。
0159デフォルトの名無しさん
2007/10/18(木) 14:38:12C++でなおかつ関数じゃなくてクラスor構造体or共同体なら宣言できるが…。
gcc拡張使ってないから分らない…
(ヲイヲイ)
0161デフォルトの名無しさん
2007/10/18(木) 16:04:49gccの拡張。
また、gccでも、CではできるがC++ではできない。
例:
void func(int x[], int y[], int n)
{
int i;
double average(int x, int y){
return (x + y) / 2;
}
for(i = 0;i < n;i++)
printf("%d\n", average(x[i], y[i]));
}
みたいな感じで使う(例が悪くてすまん)
0162デフォルトの名無しさん
2007/10/18(木) 16:25:47カプセル化したいんならC++でやるべきだろ
0163デフォルトの名無しさん
2007/10/18(木) 19:29:200164デフォルトの名無しさん
2007/10/18(木) 19:36:17if(b==0.0 || a%b!=0.0)
{
}
がコンパイル通らないんですが、doble型の%演算は
0165デフォルトの名無しさん
2007/10/18(木) 19:36:48double a,b;
if(b==0.0 || a%b!=0.0)
{
}
がコンパイル通らないんですが、double型の%演算はできないんですか?
0166デフォルトの名無しさん
2007/10/18(木) 19:41:08浮動小数点数の比較で ==, != を使うのはどうかと思うがな。
0167デフォルトの名無しさん
2007/10/18(木) 19:41:19ないです。fmod関数を使ってください
0168デフォルトの名無しさん
2007/10/18(木) 19:43:200169デフォルトの名無しさん
2007/10/18(木) 19:46:270170デフォルトの名無しさん
2007/10/18(木) 19:49:21Fortran
0171デフォルトの名無しさん
2007/10/18(木) 20:22:15int main (void)
{
int a=0xFFFA;
printf("%d,%p",a,&a);
return 0;
}
仮に&aのアドレスが0012FF88だった場合に
1バイト目(FA)は0012FF88ですが、
int aの2バイト目(FF)のアドレス 0012FF89を
得るにはどうしたらいいでしょうか?
0172デフォルトの名無しさん
2007/10/18(木) 20:32:35#include<stdio.h>
int main(void){
int a=0xFFFA;
printf("%d,%p\n", a, &a);
printf("%p\n", (char*)&a+1);
return 0;
}
0173デフォルトの名無しさん
2007/10/18(木) 20:37:14Windows(Intel)の場合はこうでなかったかな?
0012FF88 00
0012FF89 00
0012FF8A FA
0012FF8B FF
0174デフォルトの名無しさん
2007/10/18(木) 20:39:01#include <stdio.h>
struct int_filter{
char byte[sizeof(int)/psizeof(char)];
};
int main (void)
{
int a=0xFFFA;
struct int_filter *f;
f = (struct int_filter *)&a;
printf("a:value->%d,address->%p",a,&a);
printf("filter:[0]->%p,[1]->%p,[2]->%p,[3]->%p"f->byte,f->byte+1,f->byte+2,f->byte+3)
return 0;
}
0175デフォルトの名無しさん
2007/10/18(木) 20:41:140176173
2007/10/18(木) 20:42:23無視してくださいw
0177171
2007/10/18(木) 20:48:12できた〜〜〜ありがとうございます。
>>174
174さんのコピーして貼り付けたんですが、
コンパイルできませんでした。
初心者なのでソースが難しすぎてどこを直せばうごくかさっぱりですが
どうもありがとうです。
0178デフォルトの名無しさん
2007/10/18(木) 20:56:25sizeof(int)==4なら
0x00FFFAは
FA,FF,00,00 でしょIntel系なら。
00,00,FF,FA の順ががモトローラ系(スペル忘れちった)
0179デフォルトの名無しさん
2007/10/18(木) 21:21:570180デフォルトの名無しさん
2007/10/18(木) 21:51:54>>174のヤツ。
psizeof→sizeofのタイプミス
2つ目のprintf、閉じる方の「"」の後ろに「,」が無い。文の最後に「;」がない。
ミス自体は初心者レベルのモンだな。
まぁどうでも良いけどな・・・
0181デフォルトの名無しさん
2007/10/18(木) 22:35:06#include <stdio.h>
#define MAX_SIZE 30
int stack[MAX_SIZE];
int sp = 0;
void push( int x )
{ stack[sp] = x;
sp++;}
int pop(void)
{ int x;
x = stack[sp-1];
sp--;
return x;}
〜スタックが空か判定(省略)〜
0182デフォルトの名無しさん
2007/10/18(木) 22:36:16{ int i;
printf( "size = %2d:", sp );
for( i = 0; i < sp; i++ ){
printf( " %4d", stack[i] );
}
printf( "\n" );
}
int main()
{
push( 1 ); show();
push( 2 ); show();
push( 3 ); show();
printf( "pop: %4d\n", pop() );
printf( "pop: %4d\n", pop() );
printf( "すべてpopします...\n" );
while( !is_empty() ){
printf( " %4d", pop() );
}
return 0;
}
スタックの内容を少しずつ表示していくものなんですが、
これだとpush関数とpop関数の所は場合によっては危ないよ、と言われました。
ポインタとか使ったほうが良いんでしょうか?
危ない、の意味すらわかりません。分かる人居たら教えてください。
0183デフォルトの名無しさん
2007/10/18(木) 22:39:550184デフォルトの名無しさん
2007/10/18(木) 22:40:20たとえばpushしてないのにいきなりpopするとか
0185デフォルトの名無しさん
2007/10/18(木) 22:44:34>>181
ようするにMAX_SIZE以上pushしようとしたときと、
空の時にpopしようとしたときにまずい。
0186デフォルトの名無しさん
2007/10/18(木) 22:48:17なら俺も黙っとく。
0187デフォルトの名無しさん
2007/10/18(木) 22:48:19pushする時にはオーバーフローしないか(配列から溢れないか)、
popの時にはスタックが空でないかチェックするのは鉄則
pushなら
if(sp < MAX_SIZE)
popなら
if(sp > 0)でチェックすればいい
0188186
2007/10/18(木) 22:50:080189181
2007/10/18(木) 22:58:36危ない、ってそれのことだったんですね。
push関数で最大値以上にpushしたらどうなるのか、エラー出てないし
まあ良いかと思ってたんですが、油断していました。
(181の最後で「空かどうか判定」の部分は省略しましたが、
そこのことだと思ってました。)
自分でちょっと直してみます。
0190デフォルトの名無しさん
2007/10/19(金) 06:02:19int main(){
char *str="test";
str[1]='s';
printf("%s\n",str);
return 0;
}
これを試してみたのですが、何も表示されません。
どこが問題なのでしょうか?
0191デフォルトの名無しさん
2007/10/19(金) 06:10:360192デフォルトの名無しさん
2007/10/19(金) 06:27:51ポインタや配列に関する知識が中途半端な証拠
0193デフォルトの名無しさん
2007/10/19(金) 06:37:350194デフォルトの名無しさん
2007/10/19(金) 06:42:43それは処理系によって動作が異なる。
何も表示されないどころかエラー吐いて止まる場合もあるし、
>>190の望みと思われるtsstを表示して正常終了する場合もある。
つまり、コンパイルできるからといって書いてはいけないコード。
0195デフォルトの名無しさん
2007/10/19(金) 06:43:490196デフォルトの名無しさん
2007/10/19(金) 06:45:17printf("%c",str);
とした場合には、ちゃんとeが表示されます。
これってつまりstr[1]には文字が入っているということですよね。
では何故そこに代入することができないのでしょうか?
0197デフォルトの名無しさん
2007/10/19(金) 06:59:28そこってどこだと思う?
0198デフォルトの名無しさん
2007/10/19(金) 07:11:28そこにsを代入しようと思うのですが。
0199デフォルトの名無しさん
2007/10/19(金) 07:26:45→そのビルへは階数に関わらず手紙を届ける事が禁止されている
0200デフォルトの名無しさん
2007/10/19(金) 07:32:380201デフォルトの名無しさん
2007/10/19(金) 07:34:31出ないにしても、代入が無効になるだけだと思うのですが、表示すら何もされなくなるのは何故なのでしょうか。
0202デフォルトの名無しさん
2007/10/19(金) 08:46:11うまくいかない環境もあり,うまくいく環境もある
0203デフォルトの名無しさん
2007/10/19(金) 08:48:31配列とポインタが同じように扱える保証はないからな
0204デフォルトの名無しさん
2007/10/19(金) 10:52:15探しているんですが、何かおすすめの本てありますか?
今手元にあるのはメディックエンジニアリングの「これから
はじめるC言語基礎の基礎」という本なんですが・・・・
0205デフォルトの名無しさん
2007/10/19(金) 10:58:280206デフォルトの名無しさん
2007/10/19(金) 11:50:24いやでもやってることは、文字列の先頭から2バイト目に文字を代入する、ってことですよね?
配列で宣言してもポインタで宣言しても、データがメモリに連続で格納される、という点は変わらないはずです。
いくら処理系依存と言っても、配列だけ何故か1KBごとに飛び飛びで格納する、
なんてトリッキーなことはしていないと思うのですが、しているのですか?
もしそうならば、わざわざ配列の格納方式だけ処理系依存にする意味なんてあるんですか?
0207デフォルトの名無しさん
2007/10/19(金) 12:04:51文字列リテラルと配列の区別をつけよう。
0208デフォルトの名無しさん
2007/10/19(金) 12:05:18>>190のコードで実際にどんな値が入ってるか、確認してみれば?
printf("%d" , str[1]);
%cじゃなく%dで
もし代入失敗してるなら代わりに何が入ってるか確認できるし
0209デフォルトの名無しさん
2007/10/19(金) 12:12:01機能として違うのはわかりますが、メモリの格納方式まで別々にする意味は何でしょう?
単に不便にしているだけとしか思えないのですが。
>>208
同じ値が入っていました。さすがにこれはおかしいと思い、VCのモードをReleaseに変えたら動きました。
しかし根本的な問題解決にはなっていません。何故こう無駄に不安定なのか…
0210デフォルトの名無しさん
2007/10/19(金) 12:27:500211デフォルトの名無しさん
2007/10/19(金) 12:30:35「このモジュールはデバッグモードでコンパイルして
こっちはリリースモードでコンパイルしないとダメだからな」
嫌すぎる…
0212デフォルトの名無しさん
2007/10/19(金) 13:22:06文字列リテラルを使うときに、メモリを節約できるから。
つまり、次のコードは、同じ値を出力するかもしれない。
# コンパイラとオプションによって変わる
--
void exsample()
{
const char * foo = "abcde";
const char * bar = "abcde";
printf("%p, %p\n", foo, bar);
}
--
勿論、次のコードは只の配列だから違う値が出力される。
void exsample2()
{
char foo[] = "abcde";
char bar[] = "abcde";
printf("%p, %p\n", foo, bar);
}
0213デフォルトの名無しさん
2007/10/19(金) 13:23:230214デフォルトの名無しさん
2007/10/19(金) 13:29:260215デフォルトの名無しさん
2007/10/19(金) 13:56:580216デフォルトの名無しさん
2007/10/19(金) 15:42:13int main (void){
double a,b,c,x;
printf("Please type 1st Number >> ");
scanf("%xf",&a);
printf("Please type 2nd Number >> ");
scanf("%xf",&b);
printf("Please type 3rd Number >> ");
scanf("%xf",&c);
x=(a+b+c)/3;
printf("Average = %xf\n",x);
return 0;
}
なぜか、計算結果が違う・・・ %f が違うんでしょうか?
0217デフォルトの名無しさん
2007/10/19(金) 15:46:25%xf を %lf にしてみたらどうかな?
0218215
2007/10/19(金) 16:07:13ありがとうございました。
0219デフォルトの名無しさん
2007/10/19(金) 20:17:42文字列リテラルの内容を書き替えるプログラムの挙動は未定義。
文字列リテラルの型はchar配列となっているが、これは過去との互換性のため。
蛇足だがC++ではconst charの配列となっている。
(ただし、またも互換性のためchar*への型変換は定義さらている)
>>206
組み込みではROMに配置できるようになる。
Windowsなど高水準なOSでは、規格の規定から
文字列リテラルの書換はするべきでないと
認知されているため、文字列リテラルが
格納されている辺りを読取専用にする。
0220デフォルトの名無しさん
2007/10/19(金) 21:09:41「メモリの節約のため」でまとめちゃってもいい気もするけどね。
なんかメモリの節約以外の理由で文字列リテラルはROMのが良い理由があったら、
後学のために教えたって欲しいかも。
0221デフォルトの名無しさん
2007/10/19(金) 21:39:110222デフォルトの名無しさん
2007/10/19(金) 22:18:08fclose(fp); とすると、どうなるのでしょうか?
0223デフォルトの名無しさん
2007/10/19(金) 22:21:130224デフォルトの名無しさん
2007/10/20(土) 12:19:02詳しく言うと、エラー時にはEOFが返される。
成功時は0が返される。
0225デフォルトの名無しさん
2007/10/20(土) 13:31:04NULLかゴミ値じゃねぇの?
0226デフォルトの名無しさん
2007/10/20(土) 13:47:34以下はMac OS X Tigerのfclose(3)から引用
> The fclose() function does not handle NULL arguments; they will result in
> a segmentation violation. This is intentional - it makes it easier to
> make sure programs written under FreeBSD are bug free. This behaviour is
> an implementation detail, and programs should not rely upon it.
実際にfcloseにNULLを渡してみたらsegvが発生した。
おっしゃるとおりの御利益はあるかもしらんが、ちゃんと規格に準拠しようぜ…
0227デフォルトの名無しさん
2007/10/20(土) 18:16:47const char test[] = {"abcdef"};
で
cとdの間に0x04を入れたい場合どう書けばよいのでしょうか
0228デフォルトの名無しさん
2007/10/20(土) 18:31:080229227
2007/10/20(土) 18:42:470230デフォルトの名無しさん
2007/10/20(土) 19:12:41\04は8進表記。
0231デフォルトの名無しさん
2007/10/20(土) 20:04:000232デフォルトの名無しさん
2007/10/20(土) 20:08:21printf("%d\n", (int)x);
こうか?
0233デフォルトの名無しさん
2007/10/20(土) 20:08:42%.0f
0234デフォルトの名無しさん
2007/10/20(土) 20:09:56>>233
どちらでもできました!ありがとうございました
0235デフォルトの名無しさん
2007/10/20(土) 20:30:34MFCを使ったC++プログラミングは、C言語と似ているようで
似ていないですね。
0236デフォルトの名無しさん
2007/10/20(土) 20:36:52単にC++をCとして使ってただけだろ
0237デフォルトの名無しさん
2007/10/20(土) 20:37:270238デフォルトの名無しさん
2007/10/20(土) 20:40:47クラス、例外処理、テンプレート、新たに覚えることはたくさんある
0239デフォルトの名無しさん
2007/10/20(土) 21:02:21同じだと思っている人と一緒に仕事するとよーっくその事を実感することになる。
0240デフォルトの名無しさん
2007/10/20(土) 23:10:59printfって、%fでdouble型もfloat型も受けるよな?
それが、よく分らなくなった。
double型とfloat型って、サイズが違うはずだから、
引数から取り出すとき、区別がつかなくて、おかしくならないか?
0241デフォルトの名無しさん
2007/10/20(土) 23:13:34というわけで、可変引数だと暗黙的にfloatはdoubleに変換されるらしい
0242デフォルトの名無しさん
2007/10/20(土) 23:13:520243デフォルトの名無しさん
2007/10/20(土) 23:50:12でもそういうのってコンパイラによって違うのでは?
それってANSI Cで決められてたっけ?
0244デフォルトの名無しさん
2007/10/21(日) 00:07:10ANSIというか規格で決まっている。
floatは受ける型がわからない関数に渡されるときはdoubleに格上げされる。
これはプロトタイプの与えられていない関数の引数、あるいは可変引数のときに起こる。
なので、printfに渡すときはfloatもdoubleもどちらもdoubleとして渡されることになる。
似たようなことがcharにも言えて、これはintに格上げされる。
0245デフォルトの名無しさん
2007/10/21(日) 01:21:25#include "myheader.h"
int main(){
int list_num[100];
FILE *fp;
int i;
char buf[100][30];
というプログラムの最初の部分において
gcc -c main.c
main.c: 関数 `fgword' 内:
main.c:3: error: 文法エラー before '{' token
main.c:9: error: 文法エラー before "fp"
make: *** [main.o] エラー 1
main関数内でいきなりこういうエラーがでるんだけど
どういうことなんでしょうか?
main関数内にfgwordは使ってないんですけど
0246デフォルトの名無しさん
2007/10/21(日) 01:22:490247デフォルトの名無しさん
2007/10/21(日) 01:35:24int fgword(int);
にセミコロンがなかったからこういうエラーがでたようです。
ありがとうございます。
突然こんなエラーでてきてびびった。
0248デフォルトの名無しさん
2007/10/21(日) 03:41:30処理させるのと
ノートパソコンで処理
させるのと
音が違うな。
デスクトップはうるさくてやってられない。
実行に10分くらいかかるプログラムを動かしてるとき
デスクトップだとかなり沸いてくるし。
0249デフォルトの名無しさん
2007/10/21(日) 03:45:400250デフォルトの名無しさん
2007/10/21(日) 12:38:50charだと8bitになってしまいます
0251デフォルトの名無しさん
2007/10/21(日) 12:39:12ch = "test1";
ch = "test2";
↑で"test2"を代入した時点でメモリリークしてますか?
0252デフォルトの名無しさん
2007/10/21(日) 13:11:01メモリリークの意味を考えてください
確保したメモリを使用後も開放せずにいることですよ
で、それは該当すると思いますか?
そもそも領域確保していないのに
■ このスレッドは過去ログ倉庫に格納されています