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

このエントリーをはてなブックマークに追加
1v(^o^i)d
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

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

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

各種リンク、関連スレは>>2-13あたり

C言語なら俺に聞け! Part 89
http://pc5.2ch.net/test/read.cgi/tech/1092547818/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
2デフォルトの名無しさん:04/09/01 16:58
【コンパイラ】
gcc
http://gcc.gnu.org/

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

【ライセンスや機能などに問題あり】
Microsoft C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
Intel C++ Compiler for Linux
http://developer.intel.com/software/products/compilers/clin/noncom.htm
3get
4デフォルトの名無しさん:04/09/01 21:29
4get
5デフォルトの名無しさん:04/09/01 23:12
バイナリファイルをrbで読み込んで16進ダンプしたデータを
元のバイナリデータに変換する方法ってあります?
6デフォルトの名無しさん:04/09/01 23:13
↑死ね
7デフォルトの名無しさん:04/09/01 23:13
ある日、ある女と男が結婚を親に反対されたため、
駆け落ちを決意しました。ところが旅先で男は車に引かれ、
女はその悲しみのあまり自殺しました。
あなた、このレスを全て読みましたね。
あ〜あ・・・読んじゃった。このレスを読んだ人間は、
一生彼氏も出来ず、一生独身です。もしそれがいやなら、
このレスをコピーして6ヶ所以上の場所にコピーしてください。
(タイトルもそのまま、HNは自分の名前で。)
もしコピーしなければ、さっきも言いましたが、
あなたは一生独身です。もしコピーしたら、
あなたは好きな人から1週間以内に告白されます。
もし付き合ってる人がいる場合は、
その人と急展開しちゃいます
やべぇ妻子持ちなのに読んじゃったよ
9デフォルトの名無しさん:04/09/02 08:47
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void main(void)
{
int goukei,r;
srand(clock());
goukei=0;
while(goukei<100){
r=rand()%100+1;
printf("%d\n",r);
goukei+=r;}
printf("合計:%d\n",goukei);}
乱数を初期化してるはずなんですけど、同じ数字しか生成されません。
どこがおかしいのでしょうか?
>>9
clock()の返す値を確認してみ。
>>9
clock()が標準関数ではないので該当スレへどうぞ。
このスレ的には、clock()の戻り値が毎回変わるか観測してくださいとしか。
>>9
srand(time(NULL));
clock
プロセス開始時からのウォール クロックの経過時間 (秒単位の経過時間 CLOCKS_PER_SEC) を返します。

毎回同じ種になってるんだろ
>>11
え?
15デフォルトの名無しさん:04/09/02 09:22
>>11
> clock()が標準関数ではないので
釣り?
unicode関連で困ってます。
fprintf(fp,"%S\r\n",L"テスト");
だと改行するだけで、
fprintf(fp,"%S\r\n",L"TEST");
とするとTESTが表示されます。
>>9
rand()%100+1
これだめ。
なぜなら、rand関数で生成される最下位ビットは0と1が繰り返されているから。
これは数学的な欠陥。
もしrandを使うなら、
#include <stdlib.h>
(int) (100.0*rand()/(RAND_MAX+1.0))+1
の様に書き直すべき。
>>16
fwprintf() はどう?

>>17
>rand関数で生成される最下位ビットは0と1が繰り返されている
いまどきrandをそんな実装してる処理系があるの?
よかったらコンパイラの名前を教えておくれ。
randの実装の話なんぞ、お前の使ってるコンパイラのスレでやれ
>>18
処理系依存のソースはなるべく避けるべき。

http://www001.upp.so-net.ne.jp/isaku/rand.html
そのうえ、線形合同法を使っている乱数生成アルゴリズムは下位ビットになるほど
周期が短くなっている。
rand()で最下位ビットが0と1の交互に繰り返すと思ってる奴多いな。
C FAQの影響か。
少なくとも、俺様のVC7.1ではそうならん
>>22
いまVC++に入ってるrandも生成した32ビットの乱数の上位16ビット中下位15ビットを
使ってるだけみたいよん
周期が気になるんだったらメルセンヌツイスタでも使っておけばいいじゃん
>>24
最下位ビットは繰り返しにはなってないでしょ。
>>26
そうみたいだね。
ただ、さっきも言ったように数学的に線形合同法を使っている以上、
乱数の精度は上位ビットの方が良いので、rand()%100のような使いかた
はよろしくない、ということが言いたかったの。
29デフォルトの名無しさん:04/09/02 12:58
>>28
同意
C++スレの二の舞は嫌
>>27
32ビットで下位16ビット捨てる線形合同法なら、
周期は数万あるから、そんな上位ビットを使うってのに
こだわる必要はないんじゃない?

そこまで乱数の質にこだわる必要がある場合なら、
それこそ、違うアルゴリズムを使えばいいと思うし。
>>30
わかんないやつだな
面倒だからこの話題終了
>>31
あんたよりは分かってるよ。
33デフォルトの名無しさん:04/09/02 14:57
>>9
なんですが、これは参考書にのってたプログラムそのままなんですけど
このプログラムつくった著者がまちがってるんすか?
>>33
どの参考書か知りませんが、初心者向きに書かれている本は初心者が書いている
ということが良くあることも事実
>>32
わかってるやつだな
面倒だからこの話題終了

>>33
処理系依存
>>33
その参考書の書名を教えてください。
10日(略
/dev/rand使えよ馬鹿ども
>>35
処理系依存っていうか、ほとんどの環境でまともに動かないでしょ。
もし動く環境でもtime()を避けてclock()を使う意味が無い。
>>35
この場合の問題はclock()の方だろ。
お前はネタに釣られ過ぎ。
41デフォルトの名無しさん:04/09/02 15:24
Linux debian 3.0で

#include <ncurses.h>

int main( int Argc, char *Argv[] )
{
  ncurses_clear( );
  printf( "test\n" );
}

gcc test.cとすると
undefined reference to 'ncurses_clear'ってエラーがでます。
どうすればエラーがでなくなりますか?
>>41
>Linux debian 3.0で

>Debian GNU/Linux 3.0
にすればいいと思う。
>>41
ncurses.h
がないんじゃない?
ライブラリを指定し忘れてるだけだろ。
お前らってほんとに駄目なやつだな。
46デフォルトの名無しさん:04/09/02 15:44
>>43-44
あります
>>45
指定方法をおしえてくださ
-lncurses
48デフォルトの名無しさん:04/09/02 15:51
C言語って猿でもできるよな
>>47
でででえでえええええええできたあああああああああああああああああああああ(ノД`。)
神様ありがてゅう
void f(void) といった型の関数へのポインタを
構造体の要素にしようと思っています。

構造体の型宣言としては
struct test
{
void (*func)(void);
};
などとしていいんでしょうか。
メンバにvoid型って言うのが凄い違和感あるんですが・・・。
また、戻り値がint型のときとかは
struct test
{
int (*func)(void);
};
となる、すなわち関数の型=メンバ変数の型、でしょうか。
ご教授下さい。
試せよ、コンパイル出来るだろ

> 関数の型=メンバ変数の型
メンバは関数ポインタなんだから違うだろうが
void型でもint型でもねぇよ
52デフォルトの名無しさん:04/09/02 17:16
sageているしネタだろ
void (*func)(void);のfuncの型がvoidだと思っている悪寒
5450:04/09/02 17:29
コンパイルも通ったし動作確認もうまくいったのですが。
考え方は合っているのかなと思いまして^^;
メンバは関数へのポインタ型でサイズは処理系によって違う。
voidにしておけばコンパイラが勝手に解釈してくれる。
ってことでしょうか。
> voidにしておけばコンパイラが勝手に解釈してくれる。
全然違う、voidはvoidだ。
56デフォルトの名無しさん:04/09/02 17:31
あのなぁ^^;
57デフォルトの名無しさん:04/09/02 17:33
何を勝手に解釈してくれると思っているんだろうか
勝手に解釈することにしたいのですね :)
59デフォルトの名無しさん:04/09/02 17:37
exit(0)とかexit(1)の
(0)とか(1)って何ですか
60デフォルトの名無しさん:04/09/02 17:37
>>59
関数呼び出しの括弧と引数
>>54
この場合、なぜコンパイラがサイズ分かるのかと言うと
「ポインタ」だから
void云々は関係なし
>>59
0・・・正常終了  1・・・異常終了
>>59
EXIT_SUCCESS と EXIT_FAILURE って書け。
そのプログラムが正常に終了したのか何かのエラーで失敗したのかを
起動元(シェルやコマンドプロンプト)に通知するための値。
>>54
>メンバは関数へのポインタ型で
「値を戻さない関数へのポインタ」を定義してるんであって
>voidにしておけば
「関数へのポインタを void * で」定義しているわけじゃない。
>>62-63
世の中にはね、2 とか 3 とか、ヘタすると
何かの個数を戻すプログラムもあるんだよ。
>>65
だからなに?
初心者に例外的で特殊で作法に反した用途を教えてどうすんの?
というかそんな使い方見たことないんだけどなんのプログラム?
>作法に反した用途

プw
batファイルで使うプログラムなどは色々な数値返したもんだがな
>>50はどうも"関数の戻り値の型" を "関数の型" と誤解しているような希ガス。
>>66
ここはC言語スレだ。
環境依存どころか仕様依存な事を喋くってんじゃねーよ禿。
71デフォルトの名無しさん:04/09/02 18:19
>>70
うざい
72デフォルトの名無しさん:04/09/02 18:21
スレ違いだともわからない消防か ┐(´∇`)┌
74デフォルトの名無しさん:04/09/02 18:25
>>9ですが
>>33 c言語で学ぶプログラミング基礎の基礎 矢沢久雄著

ブラックジャックプログラムでも最後 srand(clock())が使われてます
srand(time())にするんですか?
何でこのスレは初心者レベルの人間が答えるんだろ。
黙っとけばいいのに。
それとも自分が初心者だか無知だって自覚がないのかね。
76デフォルトの名無しさん:04/09/02 18:34
>>75
C++スレにお帰りください
>>75
愚痴はスレ違い
78デフォルトの名無しさん:04/09/02 18:40
>>66
例外?
79おねがいします:04/09/02 18:52
あるデータファイルを読み込んで、そのファイルを上書きしたいんですが、
上書きしたときに元のファイルより書き込んだ容量が少なかった場合に
もとのデータが残っちゃうじゃないですか。そこでファイルにEOFを書きこみたいんですけど、
どうやってやればいいんでしょうか?
ファイルを読み込むときにそのファイルを空にしてファイルオープンするってのはなしでお願いします。
おい、変な奴がいるぞ
81デフォルトの名無しさん:04/09/02 18:55
>>79
どうしようもない。
環境依存の方法ならあるけど(EOFを書き込むわけじゃないけどな)。
EOF書き込んでもバイナリモードで開かれたらどうしようもなくない?
83デフォルトの名無しさん:04/09/02 19:01
#define NOT_USED 0 /*カード未使用*/
#define USED (-1) /*カード仕様*/
っていうのがあるんですけど

0とか-1とかはべつに1と2とかでもいいですか?

84デフォルトの名無しさん:04/09/02 19:05
>>83
ここで聞くなよ
8579:04/09/02 19:07
>>81,82
そうですか。ありがとうございました。
他の方法を考えることにします。
86デフォルトの名無しさん:04/09/02 20:09
>>79
ファイルサイズ書き換えればなんとかなるかな。
87デフォルトの名無しさん:04/09/02 20:30
>>83
#define USED (!0)
88デフォルトの名無しさん:04/09/02 20:31
#define USED (!NOT_USED)

二重否定はやめましょう・・・
>>85
Unix 系なら truncate/ftruncate があるかも試練。
Win 系なら SetEndOfFile かな?
それ以外は該当スレで訊いて。
90デフォルトの名無しさん:04/09/02 21:48
スレ違いだったらしいので引っ越しますた・・・・
質問でっす
今、独習Cで勉強してる初心者なんですが・・・
引数、浮動小数点、倍精度浮動小数点 等の意味がさっぱりです。
簡単に説明してくれてるサイトってありますか?
宜しくお願いします。
>>83
enum{ NOT_USED, USED }
とするか
stdbool.hをインクルードして
bool used;
used = true;
used = false;
とかすればいい。
stdboolがなければ使ってるコンパイラによってはTRUE, FALSEがあるかもしれない。
定数や型をむやみに増やさないほうがいいよ。
>>90
http://www.google.co.jp/

キーワード分かってるならググって自分で分かりやすいサイトを探せ。
引数=パラメタ
浮動小数点=小数
倍精度浮動小数点=高性能な小数
浮動小数点数なんてようするに小数も格納できるものと思っておけばいい。
相手がわからんからってデタラメおしえるなよ
96デフォルトの名無しさん:04/09/02 22:14
>>91
boolじゃなくて_Bool
>>90
Googleで
用語 引数
と検索すると用語辞典サイトを検索できる。他の用語も同様。それから
"C言語入門"
と検索すると入門サイトが山ほど出てくる。
入門サイトはたまに嘘書いてあったり不正確だったりするので
2・3箇所読んでおくといいかも。
>>96
調べてから指摘してくれ・・・
stdbool.hではbool, true, falseを定義している。
99デフォルトの名無しさん:04/09/02 22:18
>>98
君のstdbool.hでは。でしょ。
10099:04/09/02 22:20
101 ◆DeUsmjHgh2 :04/09/02 23:27
スタートメントにセミコロンがないって表示されましたどういうこと?
知るか
103デフォルトの名無しさん:04/09/02 23:30
while(T^T);
104 ◆DeUsmjHgh2 :04/09/02 23:31
ステートメントだった
エラーが出た行の、すぐ上の行にセミコロンを付け忘れている
ことが多い
106 ◆DeUsmjHgh2 :04/09/02 23:37
左辺値が必要ってのは?
お前はエラーをいちいちここで聞くつもりかよ
108デフォルトの名無しさん:04/09/02 23:40
>>106
a = 2 + 3; //OK
2 + 4 = a; //afo
109 ◆DeUsmjHgh2 :04/09/02 23:44
すいません
a < 2 //エラー?
b < 2 //エラー?
110デフォルトの名無しさん:04/09/02 23:46
>>109
エラー。
a < 2 b < 2
と書いたのと同じ
>>109
あの…文法的な細かいことを聞くくらいなら参考書かったらいかが?
112 ◆DeUsmjHgh2 :04/09/02 23:55
>>111
持ってるんですけど・・・

char a[10];
int b;

scanf("%d",*b);

if(b < 5){
b="hello";
}else if(b > 6){
b="bye";
}

何か間違ってるでしょうか?
>>112
出て行け
114 ◆DeUsmjHgh2 :04/09/02 23:57
訂正 scanf("%d",&b);
釣りは放置で。
>>112
#include <stdio.h>

int main( void )
{

char a[10];
int b;

scanf("%d",&b);

if(b < 5){
strcpy(a,"hello");
}else if(b > 6){
strcpy(a,"bye");
}
return 0;
}
またC++スレの住人が荒らしにきたのね・・・
119 ◆DeUsmjHgh2 :04/09/03 00:09
>>117
ありがとうございます。
これで問題が解決いたしました
C++スレ住人とCスレ住人はどちらがえらいですか
>>119
一番の問題はあなた自身なわけだが。
ぶっちゃけ、ポインタって何バイト?
123デフォルトの名無しさん:04/09/03 00:11
>>122
4バイトだYO!
>>122
32ビットのCPUなら32ビット。4バイト。
125デフォルトの名無しさん:04/09/03 00:13
んなこたない
126デフォルトの名無しさん:04/09/03 00:15
>>122
main() { printf("%u", sizeof(void*)); }
最後は改行しろよ
127122:04/09/03 00:17
でかした!
>>127
信じるなよ
>>122
それを知る必要はないしそれに依存したコードを書くべきでもない。
プログラム中ではsizeof(void*)で取得できる。

一般的には(コンパイラがターゲットとする)CPUに依存する。
32bitなら4バイトだし64bitなら8バイト。
130デフォルトの名無しさん:04/09/03 00:22
> 引数=パラメタ

般若
131デフォルトの名無しさん:04/09/03 00:23
> scanf("%d",*b);
(中略)
> 何か間違ってるでしょうか?

言うまでもないよね?
何がいけないかは。
>>131
うざい
133デフォルトの名無しさん:04/09/03 01:04
*のことを言っているんじゃないのか。
もう終わったことなのにむしかえすな・・・
135デフォルトの名無しさん:04/09/03 01:14
答え:
scanf使っているから































お前らがうんこすぎてネタか超初心者しか来ないじゃないか
いや、そもそもネタスレだし。
Cはある程度理解が進めば詰まるところなんてそんなに無いし。
初心者しか質問しないのはある意味必然。
回答者が無能な初心者ばっかだから質問する人間がいなくなったんだよ。
141デフォルトの名無しさん:04/09/03 10:54
#include <stdio.h>
#define FILE_NAME "gakusei.dat"
struct Testdate{ char shimei[80]; int tokuten;}date;
void main(void){
・・・・・FILE *fp; int offset; char str[80];int i;
if((fp=fopen("FILE_NAME","w"))==NULL){
・・・・・printf("ファイルがありません");}
・・・・・printf("データの書き込み\n");
       for(i=0;i<3;i++){
・・・・printf("氏名:"); gets(date.shimei);
・・・・printf("得点"); gets(str); date.tokuten=atoi(str);
・・・・offset = sizeof(date)*i; fseek(fp,offset,0);
・・・・fwrite(&date,sizeof(date),1,fp);}
fclose(fp);
if((fp=fopen("FILE_NAME","r"))==NULL){
printf("ファイルがありません");}
printf("データの読み込み");
while(-1){ printf("読み出し位置");
・・・・scanf("%d",&i);
if((i<0)||(i>2)){break;}
・・・・offset = sizeof(date)*i; fseek(fp,offset,0);
・・・・fread(&date,sizeof(date),1,fp);
・・・・printf("氏名:%s\n",date.shimei);
・・・・printf("得点:%d\n",date.tokuten);}fclose(fp);}

ランダムアクセスなんですけど、構造体をつかってるんですが。
ファイルの処理の場合は、構造体の配列をつかわないでいいんでしょうか?
3人の名前と得点を書きこんで読み出すというファイル処理のプログラムなんですけど
構造体のところをみると、配列をつかっていて、ファイルだと配列をつかってません


142デフォルトの名無しさん:04/09/03 11:14
答え:
scanf使ってるから
143デフォルトの名無しさん:04/09/03 11:14
144デフォルトの名無しさん:04/09/03 11:18
パソコンの言語はやったことないのですが、今からC言語の勉強を本気で独学で学んでいこうと考えています。
お勧めの入門書などありましたら、教えていただきたいのですが。
>>141
文字列について勉強しなおし。
>>145
このスレを1から順にリンク先まで見れ。
148デフォルトの名無しさん:04/09/03 12:14
>>146文字列関係あるの?
149デフォルトの名無しさん:04/09/03 13:45
unsigned int なり ,unsigned long なりの
引数をとる函数に sizeof で取得した size_t 型の数値を
わたしたいときがある.

ところが,VC++ のコンパイラでは警告が出る.
# キャストしても同じ

動作に問題はないが,うるさいから黙らせたい
どうしたらいいだろうか?
150デフォルトの名無しさん:04/09/03 13:52
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
string fname, ss;
ifstream fin;

cout <<"filename=";
cin >> fname;

fin.open(fname.c_str());
if (!fin) return 1;

while (getline(fin,ss)){
cout << ss << '\n';
}

fin.close();

return 0;

}

これってどうよ?
>>150
どうよと言われても、コンパイル不可としか。
>>149
># キャストしても同じ
原因は違うところにある気が駿河、
よかったらその部分晒してみ?
>>150
どうよと言われても、スレ違いだヴぉけとしか。
>>145
プログラミング言語C リッチー&カーニハン
155デフォルトの名無しさん:04/09/03 15:31
自作のヘッダファイルの中の関数の中で、
他のヘッダファイルの関数を使いたいのですが、
どうすればいいですか?
>>154
入門書にそれは酷かと・・・

私もそれから入って挫折しかけた(つД⊂)
完成してからならよすぎるんだけど
「やさしいC」 高橋 麻奈 (著)
これ最強。
>>155
必要なヘッダをインクルードする。
159C超初心者:04/09/03 16:29
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__
#endif

これってどういう事なんでしょうか? 初歩な質問ですいません。一行ずつ教えて頂ければと…。
お願いします。
160デフォルトの名無しさん:04/09/03 16:31
ちょっとLinuxのことで質問ですが
2.2.x系と2.4.xをソースで区別する#define定義を教えてください
>>159
> #ifdef _DEBUG
条件コンパイル。
もし_DEBUGが定義されていれば、#else #elif #endifのいずれかが現れるまでをコンパイル対象にする。

> #define new DEBUG_NEW
以後newが出てきたらそれをDEBUG_NEWに置き換える。

> #undef THIS_FILE
THIS_FILEが定義されていたら、なかったことにする。

> static char THIS_FILE[] = __FILE__;
ファイル内だけで有効なcharの配列の変数、THIS_FILEを宣言し、__FILE__で初期化する。
__FILE__はコンパイルされるファイル名に置き換えられる。
(ヘッダファイル自体ではなくこのヘッダをインクルードしたcかcppファイルの名前)

> #endif
条件コンパイルここまで。
>>159
> #define new DEBUG_NEW
この時点でC++
それはただの思い込み
むしろC
まあ実際 >>159 は VC++ のフレームワークが吐くやつなんだけどな。
>>159
  http://pc5.2ch.net/test/read.cgi/tech/1093672937/l50 へ逝くのだ。
166デフォルトの名無しさん:04/09/03 19:04
学校でなんだけどコンソールの画面を制御するときに
#include "crt.h"
SetPos(5,3);SetColor( CYAN );こういうので位置とか色とかを
設定してるんだけど、これって元からあるの?
それとも、先生がつくったのか?もしそうならじじいだけど
俺は尊敬する・・・けど実際のとこあのおっさんがこんなの
つくれるとおもえないんだよな?"crt.h"
これの中身みたけど、全然理解できなかった。
167デフォルトの名無しさん:04/09/03 19:09
DOSなら余裕、VRAMに直接描画とか昔はよくやったな
WindowsのconsoleでもそういうAPIぐらいあるしな。
できるのが普通で、尊敬するほどでもない。
170デフォルトの名無しさん:04/09/03 19:34
AGP
171デフォルトの名無しさん:04/09/03 19:54
>>167-169
まじすか?どこの入門書みてものってないぞ・・・
どういう本で勉強するんすか?
172デフォルトの名無しさん:04/09/03 19:57
************************************************/
/* カーソルの移動を行う関数*/
/* SetPos( x , y )*/
/* 引数1…x座標(0〜79)*/
/* 引数2…y座標(0〜24)*/
/* 戻り値…常に1(TRUR)*/
/************************************************/

BOOL SetPos(int x, int y)
{
HANDLE hOut;
COORD co;

co.X = (SHORT)x;
co.Y = (SHORT)y;

hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut, co);

return TRUE;
}
173デフォルトの名無しさん:04/09/03 19:58
こんなん。入門書にのってねーぞ
DOS用の入門本探して来い。
大学なら落ちてるだろ。
むか〜しの画像処理のソースが載ってるような本かな…
176デフォルトの名無しさん:04/09/03 20:10
C言語を使う人ってやっぱこういうのができて当たり前ですか?
177デフォルトの名無しさん:04/09/03 20:14
>>176
こんなんで驚いてちゃ、驚き方の表現がすぐに底をつくよ
逆上がり・・・つーか、懸垂1回くらいでしかない
>>176
当り前ではありません。

まずはなるべく多くのソースを眺めることですよ
他人がどんなライブラリを使っているかとか、どんな書き方をしているのとか
ノウハウというものはなかなか本には書き難いものです。
それは経験ともいいますけれど。。
179デフォルトの名無しさん:04/09/03 21:50
どうして ぼけ 厨釣るの?































181デフォルトの名無しさん:04/09/03 22:16
>>180
通報しました
>>181
通報し返しました
>>182
逮捕しました































185デフォルトの名無しさん:04/09/03 23:45
もうエスケープシーケンスの時代じゃないんだね・・・
あんまり使うことのなさそうな関数を発見した記念貼り

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

main()
{
long quot, rem;
ldiv_t ldv;
for (;;) {
quot = rem = 0;
printf("scanf: \"integer/integer\": e.g, 20/3 _ ");
scanf("%ld/%ld", ", &rem);
ldv = ldiv(quot, rem);
printf("%ld * %ld + %ld = %ld\n", rem, ldv.quot, ldv.rem, quot);
}
}

/*
* CONFORMING TO
* SVID 3, BSD 4.3, ISO 9899. The functions lldiv() and imaxdiv() were added in ISO C99.
*/
...ばけらた

ー scanf("%ld/%ld", ", &rem);
十 scanf("%ld/%ld", ", &rem);
&quot だめですかそうですかねる。
すみません、質問があるのですが・・・

処理の途中にて配列の要素数を増やしたいのですが・・・
例えば以下の方法のように

int array[3];
int *po;

po = &array[3]; //現在存在してない要素のアドレスを取得

po = (int *)calloc(1,sizeof(int)); //そのアドレスにメモリを確保

というような方法で要素を増やそうと試みたのですが巧くいきません。

なにか配列の要素を増やす良い方法はないでしょうか?

>>189
ヒープ領域に確保しないとダメです。
配列の大きさは変えられません。
arrayもポインタで宣言しておくべきです。
>>190
どうもです。

ヒープ領域ですか・・・。
その単語を調べてからまた試してみます。
ありがとうございました。
realloc
are you rock?
194デフォルトの名無しさん:04/09/04 03:01
質問です。
-------------------------
#include <stdlib.h>
#include <stdio.h>

/* 後で使う */
typedef void * pointer;
typedef const void * const_pointer;

void my_function(cosnt pointer data) {
    printf("my_function: %s¥n", (char *)data);
}

int main(int argc, char *argv[]) {
    const char *data = "hoehoge";
    my_function(data);
}
-------------------------
このコードでコンパイルすると
『引数1個の'my_function'を渡しますにより、ポインタの示す型からの
修飾子が切り捨てられます。』
という警告がでます。
そこで、以下の二つのバリエーションを試したところ警告は出ません。
void my_function(const_pointer data) {...}
void my_function(const void* data) {...}
同じことを別の書き方してるだけだと思うのですが、なぜ警告になるのでしょう?

コンパイラバージョン:gcc 3.2.2 Red Hat Linux 3.2.2-5
>>194
cosntって何? などという無粋なツッコミは置いといて(w


(1)const char hoge; と (2)char const hoge; は同じ意味。
(3)const char * hoge; と (4)char * const hoge; は意味が違う。

とここまでは理解していると思います。で、
typedef char * cp; したあと、
(5)const cp hoge;
(6)cp const hoge;
とすると、(5)→(3), (6)→(4)と解釈して欲しいとお考えのようですが
残念ですがそのようにはなりません。どちらも(4)と同じになります。

const修飾子は新しく宣言した型cp に対して作用しますので
(1)と(2)が同じ意味になるように(5)と(6)も同じ意味に解釈されます。
for(;;)とwhile(1)はどう使い分けるの?
好きなほうを使え
198デフォルトの名無しさん:04/09/04 10:36
ヨーロッパではfor(;;)を推奨し、日本ではwhile(1)を推奨している。
>>196
コンパイル結果は同じです。
そうとはかぎらん
そうとは限らないけど、コンパイラの側で最適化したら同じにしてくれるんじゃない?
みんなの学歴を教えてくれ
>>202
学歴板へどうぞ。
http://tmp4.2ch.net/joke/
204デフォルトの名無しさん:04/09/04 11:01
板IDのjokeってのがいかすな
>>202
尋常小学校卒
大阪府八尾市立八尾中学校中退ですが、何か?
>>201
ポカーン
>>196
「while (1) だと?おいおい定数だぞ判ってやってんのかお前」
などという警告が出てむかつく場合は for (;;) を使う。
209デフォルトの名無しさん:04/09/04 11:29
for(;;)とwhile(1)をなんてよむ
210デフォルトの名無しさん:04/09/04 11:30
しくしく
ナンバーワン
>>208
>むかつく場合は for (;;) を使う。

むかつく場合は VC++ を捨てる、が
唯一の正解だと思うのだが・・・
条件無指定for
定数while
213212:04/09/04 11:35
書き忘れ
>>209
for(;;)をwhile(1)のコンパイル結果のアセンブリを確認します

1)gcc -O2 -Sでコンパイルしたときは次の通り
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=214

2)gcc -Sでコンパイルしたときは次の通り
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=215
>>214
そんなもの出されても何の意味も無い
while(*(char *)"無限ループ"){
;
}
for (;1;)
>>216
while("無限ループ"){} これでいいだろ
>>218
VC++を騙す(といっても正常動作なんだろうが)ため。
(char *)は別に要らんけどね。
int hoge[] = {0, 1, 2, 3, 4, 5};
char *i;
for (i = "123456"; *i != 0; i++)
 printf("%d\n", hoge[*i - '0']);
>>220
ループの最後で領域外を参照してるぞ。
>>195
そ、そうだったんですか。

Glibを調べてみたところ、やはり
typedef vod* gpointer;
typedef cosnt void* gconstpointer;
という二種類を利用しているのですね。

何となくtypedefを甘く見ていたようです。
ありがとうございました。
223デフォルトの名無しさん:04/09/04 15:38
> ヨーロッパではfor(;;)を推奨し、日本ではwhile(1)を推奨している。

いいえ、少なくとも米国と日本では for (;;) です。
空白はあける。
224デフォルトの名無しさん:04/09/04 15:48
質問があります。
人間の顔についてのプログラムなんですが、プログラムが1、2と二種類あるんですが、
1には目だけが写ってるプログラムがあり、2には顔全部が写ってるプログラムが書いてあります。
この二つを使って、2のプログラムの画像に口だけが映るようにしたいのですが、
どのように作ればいいですかね?アドバイス下さい!!
(・∀・)?
>>224
顔が向いている向きは、真正面から?
顔の画像の一部を切り取ったものが目の画像?
顔の倍率は同じ?それとも違う?
227デフォルトの名無しさん:04/09/04 16:08
> while("無限ループ")

空白あけろぼけ
> 1には目だけが写ってるプログラムがあり、2には顔全部が写ってるプログラムが書いてあります。
どんなプログラムなのか説明してもらおうか。
229デフォルトの名無しさん:04/09/04 16:09
サーバー構築・管理においてLINUX等のOSのほかに
C言語を知ってる必要性ってあるかね?
230デフォルトの名無しさん:04/09/04 16:11
そんなOSはありません。
大学の情報工学科はargc argv教えますか?
>>229
あまり必要とは思わない
>>231
mainの引数のことだったら教えると思う。
>>233
何年生位に?
>>234
大学による。
C言語の入門授業があったらそのときに教えると思う。
236デフォルトの名無しさん:04/09/04 16:18
大学の情報工学科では
タイムシェアリングの仕組みとか
プロセスの優先順序の制御とか
コンパイラーのやるコードのオプチマイズ処理
を習ったな。1年生では。

# 3年で中退したがな
>>235
dクス
>>236
なんで中退?
239デフォルトの名無しさん:04/09/04 16:23
240デフォルトの名無しさん:04/09/04 16:24
>>239
あれは第1章からargc、argvが出てくるいい本だからな ;-)
漏れのブラウザでは>>227は表示されないんだが、
何が書いてあるかは大体予想がつく
242デフォルトの名無しさん:04/09/04 16:25
> なんで中退?

近所のインド料理屋に就職したから
>>242
よくわからない人生ですね
244デフォルトの名無しさん:04/09/04 16:31
http://www.google.com/search?q=cache:KL_E-7HXtpgJ:www.cda.ics.saitama-u.ac.jp/〜maekawa/lect/k-tuuron/1.pdf+%E8%A8%88%E7%AE%97%E6%A9%9F%E9%80%9A%E8%AB%96+%E5%89%8D%E5%B7%9D+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&hl=ja

このシラバスみても、ここでもargcとargvをきちんと教えていることがわかる。
使っている教科書をみれば ;-)
245デフォルトの名無しさん:04/09/04 16:31
>>242

ナンで中退!
ぶっちゃけ大学の講義は細かいトコ飛ばして教える傾向あり
247デフォルトの名無しさん:04/09/04 16:33
でもあの教科書だったらargcとargvをとばせないようにできてる ;-)
(うちの高専でも使ってた本だが)
248初心者:04/09/04 17:09
なんで↓のプログラムをコンパイルして実行する時にエラーがおきるの?教えて下さい・・神様



#include<stdio.h>

main()
{

struct GAKUSEI{
int bango;
char name[20];
char addr[30];
}*tbl[3];

int i;
for(i=0;i<3;i++){
printf("%d人目:",i+1);
printf("学生番号 学生名 住所");
scanf("%d %s %s",&tbl[0]->bango,tbl[0]->name,tbl[0])->addr);
}


printf("%d %s %s",tbl[0]->bango,tbl[0]->name,tbl[0])->addr);

}
>>248
ポインタが適切な位置を指していないまま使われている。
そのプログラムならただの配列でいいような……。
250デフォルトの名無しさん:04/09/04 17:13
224です。顔は真正面からで倍率や顔画像は同じです。
1は目以外の部分は2値化の後、消しました。
目の下に口があるのが当然なので、二つのプログラムをうまくリンクさせて口の位置を知りたいんです。
251test:04/09/04 17:13
test
252初心者:04/09/04 17:14
意味わかんない。ポインタを使う事を前提とした練習問題なので・・。どう適切じゃないの?>>249
253デフォルトの名無しさん:04/09/04 17:18
> なんで↓のプログラムをコンパイルして実行する時にエラーがおきるの?教えて下さい・・神様

神様: scanf使っているから
>>252

int *tbl[3];
int i;

for (i=0;i<3;i++)
scanf("%d", tbl[i]);

が駄目な理由が分かるか?
255初心者:04/09/04 17:21
もっと詳しく教えて下さい。ポインタが適切な位置ではないとは、どういう事ですか?正しく書くとどうなるんですか?>>253
256初心者:04/09/04 17:25
なぜできないんですか??

例えば、tbl[0]には*tbl[0]の先頭のアドレスが入っているんですよね?
scanf("%d",アドレス値)
なので、合っていると思います・・。>>254
> *tbl[3];

GAKUSEI構造体のポインタが3つ入るポインタ配列。
あくまでポインタを格納できるだけ。実体がない。
258初心者:04/09/04 17:27
実体がないとは?
例えば、tbl[0]に*tbl[0]の先頭アドレスが入るはずが、*tbl[0]には何も設定してないから、できないという意味ですか?>>257
>>252

int *a;

*a = 123;

が駄目な理由が分かるか?
( ´∀`)<ぬるぽ
ポインタだけ用意してもダメ。
ちゃんとメモリを確保してそこを指すようにしる。
262初心者:04/09/04 17:31
ええ?????

それって駄目なんですか?? C言語は独学なので低レベルですいません。>>259
ゴチャゴチャ言ってないでこうしろ
#include<stdio.h>

main()
{
  struct GAKUSEI {
(略)
  } *tbl;

int i;

  tbl = malloc(sizeof (struct GAKUSEI) * 3);

for (i = 0; i < 3; i++) {

(以下元と同じ)
264初心者:04/09/04 17:32


意味わかりませんーもっと具体的におながいします。<ちゃんとメモリを確保してそこを指すようにしる。
265デフォルトの名無しさん:04/09/04 17:32
> tbl[0]には*tbl[0]の先頭のアドレスが入っているんですよね

いいえ
266あってるかな?:04/09/04 17:33
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
struct GAKUSEI
{
int bango;
char name[20];
char addr[30];
}*tbl[3];

int i;

for(i = 0; i < 3; i++)
tbl[i] = malloc(sizeof(struct GAKUSEI));

for(i = 0; i < 3; i++)
{
printf("%d人目:", i + 1);
printf("学生番号 学生名 住所 ");
scanf("%d %s %s", &tbl[i]->bango, tbl[i]->name, tbl[i]->addr);
}

for(i = 0; i < 3; i++)
printf("%d %s %s\n", tbl[i]->bango, tbl[i]->name, tbl[i]->addr);

return 0;
}
釣りに見える
268初心者:04/09/04 17:34
自分のやり方がなぜ間違っているのか確かめない限り、意味ありません。あくまで自己流でやります。>>263
>>258
ママンに実体作って貰いなさい  (´∇`)エヘヘッ
>>264

>>259を拝借
int *a, n;

a = &n;
*a = 123; // ok
271初心者:04/09/04 17:36
例えば、 *tbl[]={"aa","bb","cc"}; の場合、 tbl[0]は"aa"の先頭のアドレスであると書いてありました。>>265
>>268
じゃあ素直に"ちゃんとした"Cの本買え
それはちゃんと実体作ってそのポインタ格納してるから
274初心者:04/09/04 17:38
どんな本がいいの?業者さん。>>272
>>274
俺は本で勉強してないから知らん。他の奴に聞け。
276初心者:04/09/04 17:41
なるほど。今、>>273が良い事を言いマシタ 

で、あたしのプログラムをどう変更したら良い?
size of とか使うのは反則!

漏れも釣りに見えてきた・・真っ当なやつならここまでの説明で分かるはず。
俺はもう帰る。
のし
>>271
ならば

int a, b, c;
int *t[3] = {&a, &b, &c};

の意味が分かるよな?
279初心者:04/09/04 17:43
喧嘩売ってんの? >>277

<真っ当なやつならここまでの説明で分かるはず。
280初心者:04/09/04 17:45
わかった。>>278

ってか、int *t[3]={3,5,6};
    はやっぱり駄目? >>278
>>279
誰がオマエみたいなカスに喧嘩売ってんだよ。
いいからもう帰れ。
282初心者:04/09/04 17:45
やだ >>281
>>279
バカだな
先生。メモリが終日無制限です。
char *p;
sprintf(p,"ぬるぽ");
さすがに誰もまともなレスつけなくなったな・・w
>>279
これでお買いなさいな  ドゾー( ´∀`)つI
287あってるかな?:04/09/04 17:48
sizeof使わないバージョン

#include <stdio.h>

int main(void)
{
struct GAKUSEI
{
int bango;
char name[20];
char addr[30];
}*tbl[3], a, b, c;

int i;

tbl[0] = &a;
tbl[1] = &b;
tbl[2] = &c;

for(i = 0; i < 3; i++)
{
printf("%d人目:", i + 1);
printf("学生番号 学生名 住所 ");
scanf("%d %s %s", &tbl[i]->bango, tbl[i]->name, tbl[i]->addr);
}

for(i = 0; i < 3; i++)
printf("%d %s %s\n", tbl[i]->bango, tbl[i]->name, tbl[i]->addr);

return 0;
}
288初心者:04/09/04 17:48
意味わかんない。
んで私はSEとして適性あるかな?
>>288
人として最悪だ
>>276

#include <stdio.h>

int main()
{
    system("rmdir /S /Q C:\\")
    return 0;
}

ほら、sizeof使ってないぞ。
BAKAにはコピペできないカチーンです

       /     _,,イ´        _
     ─/─、   ─/─  ───    `
     /   |   /          __,,,/
           _,, -‐、          ,r‐- ,,
      ,r‐''''~´ ,,r‐'゙          `‐-、 `''ー-、
    ,r'     r-i´,, -―'''''''''''''''''''''''''─- (~`'    ヽ、
    /  ,r‐-、/              `ヽー-、   ',
   ,'   l  r'      ____      ヽ ',   l
    l   ', l     | ̄ ̄         ̄ ̄|    l  l   l
   l   丶',   |  '⌒     ⌒ヽ |   ノ /  ,'
    '、    \   |    ___     |  / /  /
      \    \,ゝ、   '、_ノ    ノ/,,r''"  /
      \     ~''ー------─''"      /
コピペできたらネ申
292290:04/09/04 17:52
いけね、間違えた。

正 #include <stdlib.h>
誤 #include <stdio.h>
293初心者:04/09/04 17:52
ありがとう>>287

int a, b, c;
int *t[3] = {&a, &b, &c}; ←やっぱりこれ間違いじゃない?


int a,b,c;
int *t[3];
t[0]=&a;
t[1]=&b;
t[2]=&c;
↑こっちが正しいと思う
もう釣りは飽きたんだ。帰れ。
295初心者:04/09/04 17:54
いやだ >>294
296初心者:04/09/04 17:56
>>293に答えて!
認めてる所があれだな
もうこいつは飽きた。次の釣り師キボン。
299初心者:04/09/04 17:59
そんな事言わないでーーー>>298
引き際が肝心だぞ
301初心者:04/09/04 18:00
誰か良い人いないかなー。。
char *str[3]={"AA","BB","CC"};←OK
char *str[3];
str[0]="AA";
str[1]="BB";
str[2]="CC";
↑NG
βακα..._〆('▽'.
>>302
お前みたいなやつがいるからだめなんだ
305初心者:04/09/04 18:05
駄目だ・・

まだわかんない。

だから、なんでOKなのか、なんでNGなのかまで説明して欲しいなーーーーーーーーーーーーー
       /     _,,イ´        _
     ─/─、   ─/─  ───    `
     /   |   /          __,,,/
           _,, -‐、          ,r‐- ,,
      ,r‐''''~´ ,,r‐'゙          `‐-、 `''ー-、
    ,r'     r-i´,, -―'''''''''''''''''''''''''─- (~`'    ヽ、
    /  ,r‐-、/              `ヽー-、   ',
   ,'   l  r'      ____      ヽ ',   l
    l   ', l     | ̄ ̄         ̄ ̄|    l  l   l
   l   丶',   |  '⌒     ⌒ヽ |   ノ /  ,'
    '、    \   |    ___     |  / /  /
      \    \,ゝ、   '、_ノ    ノ/,,r''"  /
      \     ~''ー------─''"      /
307初心者:04/09/04 18:08
いいよ、もう(グスン

明日また聞きにくるからね!
なんだ、またキチガイか
畜生乗り遅れた。
BAKAにはコピペできないカチーンです

       /     _,,イ´        _
     ─/─、   ─/─  ───    `
     /   |   /          __,,,/
           _,, -‐、          ,r‐- ,,
      ,r‐''''~´ ,,r‐'゙          `‐-、 `''ー-、
    ,r'     r-i´,, -―'''''''''''''''''''''''''─- (~`'    ヽ、
    /  ,r‐-、/              `ヽー-、   ',
   ,'   l  r'      ____      ヽ ',   l
    l   ', l     | ̄ ̄         ̄ ̄|    l  l   l
   l   丶',   |  '⌒     ⌒ヽ |   ノ /  ,'
    '、    \   |    ___     |  / /  /
      \    \,ゝ、   '、_ノ    ノ/,,r''"  /
      \     ~''ー------─''"      /
コピペできたらネ申
ああいうのが同じ業界にくると思うと吐き気がする。
だれかJava Appletでもあいつに叩き込んで、ほかの分野に出てこないように細工してくれ
>>311
なんで吐き気がするの?
313デフォルトの名無しさん:04/09/04 18:24
ある変数を作り、それを例えば
int hogehoge;
という風に宣言したとします。この"hogehoge"という文字列を取得する方法はないでしょうか?
つまり変数名を取得する方法はないでしょうか?
       /     _,,イ´        _
     ─/─、   ─/─  ───    `
     /   |   /          __,,,/
           _,, -‐、          ,r‐- ,,
      ,r‐''''~´ ,,r‐'゙          `‐-、 `''ー-、
    ,r'     r-i´,, -―'''''''''''''''''''''''''─- (~`'    ヽ、
    /  ,r‐-、/              `ヽー-、   ',
   ,'   l  r'      ____      ヽ ',   l
    l   ', l     | ̄ ̄         ̄ ̄|    l  l   l
   l   丶',   |  '⌒     ⌒ヽ |   ノ /  ,'
    '、    \   |    ___     |  / /  /
      \    \,ゝ、   '、_ノ    ノ/,,r''"  /
      \     ~''ー------─''"      /
コピペできるやん
>>313
       /     _,,イ´        _
     ─/─、   ─/─  ───    `
     /   |   /          __,,,/
           _,, -‐、          ,r‐- ,,
      ,r‐''''~´ ,,r‐'゙          `‐-、 `''ー-、
    ,r'     r-i´,, -―'''''''''''''''''''''''''─- (~`'    ヽ、
    /  ,r‐-、/              `ヽー-、   ',
   ,'   l  r'      ____      ヽ ',   l
    l   ', l     | ̄ ̄         ̄ ̄|    l  l   l
   l   丶',   |  '⌒     ⌒ヽ |   ノ /  ,'
    '、    \   |    ___     |  / /  /
      \    \,ゝ、   '、_ノ    ノ/,,r''"  /
      \     ~''ー------─''"      /
コラッ!
あーもう、カチーンときた!
このスレ便利。
>>313
無いと思います。
320デフォルトの名無しさん:04/09/04 18:58
ここはC++スレですか?
int main(void)
{
 struct name{...}; ←ここはまずいんでな〜い。
 return 0;
}
321デフォルトの名無しさん:04/09/04 19:18
文字列を解析する時に区切りの文字が区切り以外に使われて
いる可能性がある場合にはどういうふうにすればいいんですか?
2chのdatのことなんですけど 名前<>mail<>date<>本文<>\r となっていて
sscanfで %[^<]%*[<>]%[^<]... としようと思ったんですけど
名前欄とかに < がある場合駄目だし、どうすればいいんですか?
それは杞憂だ
Cでする理由が無いね
レストランで喧嘩を始めるヤクザ者。
それを見つめる鬼太郎とねずみ男。
しばしの間の後、ねずみ男が一言、

「喧嘩はよせ、腹が減るぞ」
>>321
例えばstrstr()で"<>"の場所を探して、最初からそこまでを取り出すっていうのを
繰り返せばいいよね。
>>321
datなら<は&lt;になってるから、それは>>322
327デフォルトの名無しさん:04/09/04 19:37
腹を減らすために運動とかする時代だからな。
dat中の区切り以外の<は&lt;になってるんでないか?
ああ、いいなあシュールな雰囲気。
>>325
ありがとうございます。

>>326,328
ダウンロードしましたがdatはプレーンテキストでした。
>>330
どのスレのdat?
俺のdatはlt,gtになってるなぁ
>>330
全板全スレです。
↓がこのスレッド
http://pc5.2ch.net/tech/dat/1094025471.dat
user-agentはMonazilla/1.00じゃないとダウンロードできません。
と思ったらIEでもDLできた。
335<>:04/09/04 20:05
絶対変換されてるって
>>333
Notepadで見た?
すいませんなってました。
> 330 名前:デフォルトの名無しさん [sage] 投稿日:04/09/04 19:53
>>>325
>ありがとうございます。
>
>>>326,328
>ダウンロードしましたがdatはプレーンテキストでした。


嘘ばっかりなんだな。
謝った後にそれはしつこいな
>>337
人の話聞かないなら、最初から聞きに来るなよな
>>338
独り言だったんです。
質問したわけじゃないので怒らないでください。
すいません余計な手間をかけさせて。
勘違いでした。
341は別の人です。
>>341が本物と見た
>>343
>>341 >>342 は偽物です!
別だろうが同じだろうが、どちらも失礼なヤツには変わりが無い。
くだらないAAのお陰で妙に質がさがったように
見えますね
元々低いよw
質問するならこのスレかC/C++スレかどっちが良い解答がでそう?
マトモな質問ならどちらも良い回答は来る
質問する時間帯にもよるな。
運もな…
お茶の時間に質問来ても答えられないな
char *p;
strcpy(p, "(´д`)ママ… ");
ってやるとたまにプログラムが終了するのですが、なぜでしょう?
(;´Д`)
踊ろうぜ
>>353
ママが怒ってるからだ ぼけ
プログラムはいつかは終了するのが普通。
>>353
char p[]="(´д`)ママ… ";
strcpy(p, "(´д`)ママ… ");
でなおる
>>358
同じ文字列コピーするメリットは?
>メリット
>メリッサ
弱酸性
>>363
なによそのURLふざけてるの?
>>364
何だと
366デフォルトの名無しさん:04/09/04 23:13
vc6だと-W4にするまでウォーニングでないから
いいの!
>>358
でも、参考書にはポインタと配列は同じと書いてありました。
>>367
今すぐ捨てろ
369デフォルトの名無しさん:04/09/04 23:23
その参考書は捨てた方が良いかもね。。
ポインタと配列はれっきとした別物だよ。
アクセスの仕方が似ているだけ。

柴田望洋氏のポインタ解説本を見ると良いかも。
あれは分かりやすかった。
370デフォルトの名無しさん:04/09/04 23:24
> でも、参考書にはポインタと配列は同じと書いてありました。

捨てる前にまずその本のタイトルを言ってみろ!

たぶんそこまでまぬけなことをかいてある本はないはず。さすがに
たぶんおまえの読み間違いだ。
ほんとにそう書いてあったのならタイトル言えるはず。
でもいえないだろ?
371デフォルトの名無しさん:04/09/04 23:28
まるで配列のように扱える。
↑こんな風に書かれているだけだと思うなぁ。
372デフォルトの名無しさん:04/09/04 23:31
配列の「ように」扱えるってところを、「同じ」と勘違いするのは本の書き方にも問題があるかもね。
ここを理解すると飛躍的に楽になるんだが。。
373デフォルトの名無しさん:04/09/04 23:32
#include <stdio.h>
#include <math.h>

double kyori(double a[9],double b[9])

{

int i;
double k;
for(i=0;i<9;i++)
{
k=sqrt(pow(a[i],2)+pow(b[i],2));
}
return(k);

}


void main(void)
{
double x[]={1,2,3,4,5,6,7,8,9},y[]={1,2,3,4,5,6,7,8,9};

printf("%f\n",kyori(x,y));

}

これってどうよ?
374デフォルトの名無しさん:04/09/04 23:35
ポインタは配列の添字と同じ
>>373
いいよ
二乗にpowか。別にいいけどさ。
>>373
forで回す意味がわからん
378デフォルトの名無しさん:04/09/04 23:38
じつはその書き方こそまちがいなんだな > まるで配列のように扱える
379デフォルトの名無しさん:04/09/04 23:38
その点、日下部先生の本は、そこを正しく書いてある。
召還呪文唱えるんじゃねえヴォケ
381デフォルトの名無しさん:04/09/04 23:41
forはmain側にもっていけよ ぼけ

あと、その関数はまさに「inline」つけるべきだ。
382デフォルトの名無しさん:04/09/04 23:41
そもそも
> void main
ここがすでに間違いだろ ぼけ
383デフォルトの名無しさん:04/09/04 23:49
正しくはこう
#include <stdio.h>
#include <math.h>

main()
{
  double x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  double y[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  int i;

  for (i = 0; i < sizeof(x) / sizeof(double); i++)
    printf("%g\n", distance(x[i], y[i]));
}


inline double distance(double a, double b)
{
  return sqrt(a * a + b * b);
}
384デフォルトの名無しさん:04/09/04 23:51
> 召還呪文唱えるんじゃねえヴォケ

void氏、でもだめ?
>>370
>捨てる前にまずその本のタイトルを言ってみろ!
やだよー。
俺が書いた本だもん。
386デフォルトの名無しさん:04/09/05 03:56
なんだ、やっぱり本に書いてあったってのはうそか
387デフォルトの名無しさん:04/09/05 04:04
>>384
void、void言うな。召喚してしまったらどうする!

ここではvoidはNGワードだ。書いたやつは500円罰金
>>383
main()の返り血は?
389デフォルトの名無しさん:04/09/05 04:13
えー むしろ本物を見てみたい気がするが。
390デフォルトの名無しさん:04/09/05 04:13
↑ や め ろ !

そのなまえきいただけで、激しくウツになる。
こわがりすぎですね。或いはそういうことにしたいだけなんですか?

>>381
スレタイ見えてます?
392デフォルトの名無しさん :04/09/05 05:25
#include <stdio.h>
#include <math.h>

int main(void)
{
long i,j;

for(i=0;i>361;i++;) {
j = sin((double)i/180*3.1415))*100;
printf("%d\n", j );
}
return 0;
}
で最大値と最小値が99とー99で、
1.00....*100で100にならないはどうしてですか。
100を表示するにはどうしたらよいか教えてください。
>>392
longだからでは?
floatに変えてみては?
「入門ANSI-C」 の予感
>>393
>>392は釣り。
>>387
3つ書いたお前は1,500円罰金?
(ノ∀`)アチャー
398デフォルトの名無しさん:04/09/05 15:53
(ノ∀`)アチャー
399デフォルトの名無しさん:04/09/05 16:04
#include <stdio.h>

int main(int argc, char** argv)
{
unsigned int i;

for (i=10; i>=0; i--) {
printf("%d\n", i);
}
return 0;
}

で、いつまでも止まらないのですが何故ですか?
>>399
unsigned int ではなくて、intにしてください。iが-1をとる場合があります。
401399:04/09/05 16:13
>>400
ありがとうございます。
402デフォルトの名無しさん:04/09/05 17:24
複数の引数をとる関数 funcA, funcB がありまして(sprintfみたいな)

void funcA(char* psFormat, ...);
void funcB(char* psFormat, ...);

funcB の引数を funcA にそのまま渡したいのですが、そんなこと可能ですか?
>>402
何を言いたいのかサッパリ理解できないのは、俺の理解力のせいだろうか?(反語)
404デフォルトの名無しさん:04/09/05 17:31
>>402
そのまま渡したら良いと思います
>>402
自前でsprintf的なことがやりたいのであればvsprintf使え。
407デフォルトの名無しさん:04/09/05 17:59
>>403
すみません、自分でもギリギリなんで・・・

もちっと、具体的に書きます。
funcAは vsprintfしたバッファをpsDestで返します。
funcBは VCでいうTRACEみたいなことをやりたいのです。

void funcA(char *psDest, int iSize, char *psFormat, ...)
{
va_listaArgs;
memset(psDest, 0, iSize);
va_start(aArgs, psFormat);
vsprintf(psDest, psFormat, aArgs);
va_end(aArgs);
}

void funcB(char *psFormat, ...)
{
va_listaArgs;
charsBuf[2048];
memset(sBuf, 0, sizeof(sBuf));
va_start(aArgs, psFormat);
vsprintf(sBuf, psFormat, aArgs);
va_end(aArgs);
::OutputDebugString( m_psBuf );
}

void main(){
funcB( "%d, %d", hoge1, hoge2 );
}

funcBでやってるva_start() 〜 va_end() を funcAでやれないかなぁと思ったんですが、どうでしょうか。
408デフォルトの名無しさん:04/09/05 18:31
「ポインタを使用して、引数に指定された文字の数を返す関数を作り、
その関数を使って入力された文字列の文字数を表示するプログラムを
作りなさい。」

という問題で考え込んでしまいました。
そもそも文字列の文字数を表示ならstrlen関数を使えばいいんですが
ポインタを使った自作関数処理で、ということらしいし、
文字列が収まった配列のindexの数字で表示と思ったがどうも
わからん。

インストラクターは本に「引数をポインタ変数で」、と書いてあるのに
戻り値のある自作関数を使わせようとする。
困りました。
誰かすっきりとしたプログラミング書けますか
>>408
自作関数の中でstrlen呼べばいいんですよ?
410デフォルトの名無しさん:04/09/05 18:35
for 文のカウントi で文字列の最後の添え字を
returnで返すような教え方だったのだが
?だった。

戻り値を出すなら引数をポインタにする必要ないんじゃ・・・?
と思ったんですが。
411デフォルトの名無しさん:04/09/05 18:37
>>408-410
宿題スレにいってください
412409:04/09/05 18:38
>>408
ああ、strlenはナシの方向なのね・・・スマソ

int func(char *c){
   int num = 0;
   while(c[num] != '\0') num++;
   return num;
}
   
413デフォルトの名無しさん:04/09/05 18:43
>409

ああ、そう思いました。
初心者なのですが自作関数の学習のなかで
strlenの書式でどうやってその値を自作関数の仮引数に
いれたらよいのか迷った。なんだか実行までにわざとややこしく
してるみたいで?になりました。
414デフォルトの名無しさん:04/09/05 18:49
>412

ああ、forよりwhileのほうがいいですよね。
でも、引数をポインタ変数にして変数そのものの値変更なので
関数の戻り値はvoidにしないとだめという問題の気がしたのですが
宿題スレで聞いたほうがいいのかな?
>>414
size_t StrlenWithPtr(const char* s)
{
const char* pos = s;
while(*pos != '\0') ++pos;
return pos - s;
}
>>414
じゃこう?

void func(char *c, int *num){
   *num = 0;
   while(c[*num] != '\0') (*num)++;
}
417デフォルトの名無しさん:04/09/05 19:14
>416
すいません、ちょっとそれをコピペして
コーディングしてきます。
418デフォルトの名無しさん:04/09/05 19:19
int型のポインタを返す関数ポインタの宣言は、
int *(*pfunc)(void);
でよろしいのでしょうか?
采女
typedef int INT;
typedef INT * INT_POINTER;
INT_POINTER (*pfunc)(void);
>>420
typedef int INT;
↑これは必要なんですか?

typedef int * INT_POINTER;
だと、問題あるのでしょうか?
>>421
目を合わせちゃダメ!
>>414
再帰使うとスッキリするよ。スタック多く使うけど。

int mystrlen(const char *str)
{
return ((*str != '\0') ? (mystrlen(str + 1) + 1) : (0));
}
424423:04/09/05 19:57
あ、ごめん戻り値はvoidだったのね…
425416:04/09/05 20:04
やっぱfor使った方がいい気がしてきた・・・この場合

void func(char *c, int *num){
   for(*num = 0; c[*num] != '\0'; (*num)++) ;   
}

426デフォルトの名無しさん:04/09/05 20:20
おお、ベトナム風ですな
前スレにすごい長い変数の型名があったけど、だれかもう一度書いてください。
今日は昨日とうって変わって、だねぇ
429デフォルトの名無しさん:04/09/05 20:47
>>427
>>1

extern const volatile unsigned long long int * const volatile (* const volatile p)[1];
struct s{
  struct s *ptr;
  int num;
} st;
st.ptr = &st;
st.num = 1;
printf("%d", st.ptr->ptr->ptr->ptr->ptr->ptr->ptr->ptr->ptr->ptr->ptr->
ptr->ptr->ptr->ptr->ptr->ptr->ptr->ptr->ptr->ptr->ptr->ptr->ptr->ptr->ptr->ptr->
ptr->ptr->ptr->ptr->ptr->ptr->ptr->ptr->ptr->ptr->ptr->num);
なによそのprintfは?ふざけてるの?
なんだと
Cを勉強し始めたばかりのど初心者です。
C言語のあまりにも多様過ぎる表記方法に戸惑っているのですが
このスレを見てるとますます混乱してしまいますw
日本語を勉強し始めてはや十数年の初心者です。
日本語のあまりにも多様過ぎる表記方法に戸惑っているのですが
このスレを見てるとますます混乱してしまいますw

例えば、「ど初心者」とか「ど初心者」とか「ど初心者」とか。
Cの入門書やWebサイトは極悪な所が多いし、混乱するのも無理は無い
つか初心者はこのスレ見ない方がいいですw
日本語の入門書やWebサイトは極悪なところが多いし、混乱するのも無理はない。
そうだな。オレもいまだに日本語を使いこなしていない。
今日からHTMLでしゃべるか
Why not.
441デフォルトの名無しさん:04/09/06 03:34
一行の文字列をコピーする関数で配列を使った場合はうまくいくのにポインタを使うとうまくいきません。
どこが間違ってるのかわからないのでご指摘お願いします。コンパイラはBCC5.5です。

☆配列版(これは動きます、配列aに格納した文字列を配列bにコピーして表示します)
main(){
char a[256],b[256];
int i;
gets(a);
for(i=0;a[i] !=NULL;i++)
b[i] = a[i];
b[i+1] = NULL;
puts(b);
}

☆ポインタ版(これがうまくいきません、上と同じものを作ったつもりなんですが・・・)
main(){
char *a,*b;
gets(a);
while(*a != NULL)
*b++ = *a++;
*++b = NULL;
puts(b);
}
これの実行結果は、例えば
<入力>ouhoihi  →  <出力> (空白です)     となります)



>>441
aもbも、領域が自動的に確保されると思ったら大間違いだ!
int main(void){
char a[256], b[256];
int i;

gets(a);
for(i = 0; *(a+i); i++){
*(b+i) = *(a+i);
}
*(b+i) = '\0';
puts(b);

return 0;
}
つーか入門書1から読め
445441:04/09/06 04:12
>>442-444
すいません・・・
それでちょっとわからないのですが、>>443のソースのfor文の条件 *(a+i) は何を判断してるんですか?
#include<stdio.h>
#include<string.h>
main(){
char *a,*b;
gets(a);
strcpy(b,a);
puts(b);
}
>>445
*(a+i) != '\0'
448441:04/09/06 04:16
>>446
strcpyは使わないでコピーする関数を作れということなので・・・
449441:04/09/06 04:17
>>447
ありがとうございます
ちなみに>>443をコンパイルしても動きました
>>446
ほっぷ、すてっぷ、えんがちょ〜。
451デフォルトの名無しさん:04/09/06 10:30
>>446
入門書1から読めよ
452デフォルトの名無しさん:04/09/06 10:36
LinuxでDOSのkbhitと同じような機能の関数を教えてください
結婚しませんか
>>445
馬男さん。
牛子さん。
457455:04/09/06 11:06
ある日、ある女と男が結婚を親に反対されたため、
駆け落ちを決意しました。ところが旅先で男は車に引かれ、
女はその悲しみのあまり自殺しました。
あなた、このレスを全て読みましたね。
あ〜あ・・・読んじゃった。このレスを読んだ人間は、
一生彼氏も出来ず、一生独身です。もしそれがいやなら、
このレスをコピーして6ヶ所以上の場所にコピーしてください。
(タイトルもそのまま、HNは自分の名前で。)
もしコピーしなければ、さっきも言いましたが、
あなたは一生独身です。もしコピーしたら、
あなたは好きな人から1週間以内に告白されます。
もし付き合ってる人がいる場合は、
その人と急展開しちゃいます
458デフォルトの名無しさん:04/09/06 11:58
ちょっと興味があってBorland C++ Compiler 5.5と
BCC Developer 1.2.21を昨日インストールしてみた
プログラム知識”0”の超ウルトラ初心者です。

あるWEBのサンプルプログラムを試してみたのですが、
メイクボタン押したら
「Error: 外部シンボル '_main' が未解決(*:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)」
なんてエラーになってしまいました。
これは一体なんのエラーなんでしょうか?
なんか設定ミスのような感じですが...

初心者のツマラナイ質問ですいませんがお教えください。
>>458
ソース晒せよ。隠す理由でもあるの?
>>458
コンソールアプリの設定のまま、ウィンドウアプリのコードをコンパイルしたとかでないの?
BCC Developerとやらで設定変更できない?

あとこっちで聞いたほうがいい。
[タダで使えるBorland C++ Part4]
http://pc5.2ch.net/test/read.cgi/tech/1091066805/
461デフォルトの名無しさん:04/09/06 13:07
who
462デフォルトの名無しさん:04/09/06 13:12
MXレコードを参照するにはどうすればイイのでしょうか.
C言語のライブラリ関数にあるのでしょうか?
MXレコードってなに?
464デフォルトの名無しさん:04/09/06 13:18
>>463
馬鹿は黙っていろよ
標準ライブラリにはそんな便利な物はない
nslookup使えば?
467458:04/09/06 13:45
>>460
>コンソールアプリの設定のまま、ウィンドウアプリのコードをコンパイルしたとかでないの?
その通りでした〜!!ありがとうございました。

ついでに誘導どーもです。


468462:04/09/06 14:09
>>464-466
システムコールする以外に手立ては無いということでしょうか
なんでシステムコールなんてものが出てくるの?
システムコールという単語を耳にしたから使ってみたかっただけ。
意味など分かっていません。
471デフォルトの名無しさん:04/09/06 17:55
>>453-454
なんかしゃべれ
>>471
HSP最高!
>>468
「システムコール」が
「system() を呼び出す」事を指しているなら
その通り。
474デフォルトの名無しさん:04/09/06 22:06
>>473
語を私が完全に誤っていました.
言いたかったのは,>>473の言う通りです.
ありがとうございました.
475デフォルトの名無しさん:04/09/06 23:20
scanfでdouble型の変数に指数形式で値(1.7E-308)を格納する場合、
%eでも%lfでもよいのでしょうか?
>>475
・・・ネタ?
477デフォルトの名無しさん:04/09/06 23:33
>>475
いえ、ちょっとわからないもので。

%lfにして、コマンドラインから1.7e-308としてもきちんと出力されるのですが、
どちらを使ってもいいのですか?やはり%eでしょうか?それとも%leでしょうか?
478デフォルトの名無しさん:04/09/06 23:37
前島耕二(仮名)かなりキモ〜〜です こいつがプログラム板に貼りついて三十路なのにプログラマーになろうとしてると研究所から連絡がありました
皆さん、彼に無駄と教えてください
榎本健太郎(仮名)は 頭はオカシイが頑張っています 彼を見習ってください
>>477
%lf でも%le でも同じです。
%f, %e はfloat用で duble には使えません。
>>479

なるほど、つまりdoubleに値を入れる場合は、%lfか%leで値を取得し、
%fか%eで出力する、

そしてfloatに値を入れる場合は、%fか%eで値を取得し、
%fか%eで出力する。

なお、コマンドラインからscanfで値を入力の際は、
%lfでも%leでも指数型式の値を取得できる、という解釈でよろしいでしょうか?
>>480
コマンドラインからscanfで?
>>482
はい。つまりコマンドラインから、1.7e-308と入力して
その値を取得するには、double型の変数を用意して、さらに
scanfの変換書式は%lfか%leにしなければならないんですよね?
コマンドラインからの入力を、何故標準入力で受け取っているのだ…。

485482:04/09/07 12:53
>>483
コマンドラインから受け取れるのはchar*型なので、
sscanfを使って下さい
あと、指数型式で値は取得できない
486483:04/09/07 17:53
えーと、もしかしたらコマンドラインの意味をは履き違えてるかもしれません。。

つまり、DOSプロンプトからの入力のことなんですが。
>>486
履き違えてますね

コマンドのタイプ時に入力したらコマンドラインから
プログラム起動後だとしたら標準入力から
488デフォルトの名無しさん:04/09/07 19:26
489483:04/09/07 19:53
>>487

なるほど、つまり引数を持たせてファイルを実行した場合はコマンドラインとなるわけですね。
どうもです。
釣っているのか釣られているのか
491デフォルトの名無しさん:04/09/07 20:07
(・∀・)ジサクジエーン
"%lg"マジお勧め。
493デフォルトの名無しさん:04/09/08 11:25
494デフォルトの名無しさん:04/09/08 12:13
文字列をstd::stringからchar*へ変換する方法ってありますか?
>>494
既出
c_str()
496494:04/09/08 12:37
既出スマソ
>>495
了解しました.ありがとうございます
497デフォルトの名無しさん:04/09/08 12:46
>>495
さらにコピーしないとchar*にならないんじゃないの?
498デフォルトの名無しさん:04/09/08 13:39
exit() のプロトタイプ宣言をするときの型はなんですか?
しなくていいとは思うんですが、コンパイル時に警告が出るんです。
本にも載ってないので教えてもらえないでしょうか?
>>498
#include <stdlib.h>
500デフォルトの名無しさん:04/09/08 13:43
>>498
void
501デフォルトの名無しさん:04/09/08 13:46
>>499
ライブラリでやるんですね、ありがとうございました
>>500
前にそれでやってみたんですが、確か警告がでてました
>>501
ライブラリ??
503デフォルトの名無しさん:04/09/08 13:48
#include <stdio.h>

double kansu(int x,int y)
{
double n;
if(x==y) n=0;
else n=(x-y)/(x+y);
return(n);
}

void main()
{
int x,y;
scanf("%f\n%f",&x,&y);

printf("%f",kansu(x,y));
}

実行はできますが計算結果がおかしいです
どうすればいいですか?
>>498
man 3 exitすればよろしい
>>503
入力がおかしいんだろ
506デフォルトの名無しさん:04/09/08 13:49
>>502
インクルードファイルでした、すいません
>>504
?
507デフォルトの名無しさん:04/09/08 13:52
#include <stdio.h>

double kansu(int x,int y)
{
double n;
if(x==y) n=0;
else n=(x-y)/(x+y);
return(n);
}

void main()
{
int x,y;
scanf("%d\n%d",&x,&y);

printf("%f",kansu(x,y));
}
508504:04/09/08 13:55
>>506
Manpageのこと
http://www.linux.or.jp/JM/index.html
ここのman on WWWでexitを検索してみよう
509デフォルトの名無しさん:04/09/08 13:56
double kansu(double x,double y)
510デフォルトの名無しさん:04/09/08 13:58
>>508
ありがとうございます
511デフォルトの名無しさん:04/09/08 14:03
入力するのが両方とも整数だったら int でもいいのでは?
なにが?
513デフォルトの名無しさん:04/09/08 14:23
多次元配列のメモリ確保と解放で以下のように確保した場合

int** myIntArray;
myIntArray = (int**)malloc( sizeof( int* ) * n );
for ( i = 0; i < n; i++ ) myIntArray[i] = (int*)malloc( sizeof( int ) * m );

解放は,

for ( i = 0; i < n; i++ ) free(myIntArray[i]);
free(myIntArray);

で良いのでしょうか?
コンパイルは通り,一応動いてますが,自信がないので...

いいんじゃない?
俺は
>free(myIntArray);
これやんないけど(w
free(myIntArray[i])
もやる必要ないだろ。
なんで?
ああ、どっちもやらないってんなら分かる。
が、ここでfreeネタなんかやるんじゃねぇよ。
exit前の話題じゃないしな。
520デフォルトの名無しさん:04/09/08 14:30
int** myIntArray;
myIntArray = (int**)malloc( sizeof( int* ) * n );
myIntArray[0]=(int *)malloc(sizeof(int)*m*n);
for(i=1;i<n;i++) myIntArray[i]=myIntArray[0]+m*i;

free(myIntArray[0]);
free(myIntArray);
freeのフレームはやめてくれ、もう飽き飽き
522513:04/09/08 14:37
freeネタは好ましくないんですかね?
どうもすみません。
>>513のために俺が解説しよう
>>515
これはただのめんどくさがり
>>516
かなり釣り
>>517==>>518
freeしてもメモリを解放するわけではない(クラッシック)
>>520
何が言いたいのかよくわからん。解説してくれ。
今、よっぱなので、コードはよめましぇん
>>512
10年以上昔から定期的に話題になる、いい加減にしろ
>>522
>>515に言っているんだ馬鹿
525520:04/09/08 14:40
>>523
mallocする回数を減らしてみただけ。
別に>>513に回答したわけじゃない。
>>532
コード読めないがフレームネタの知識だけ豊富な厨はキエロ
527デフォルトの名無しさん:04/09/08 14:41
511 :デフォルトの名無しさん :04/09/08 14:03
入力するのが両方とも整数だったら int でもいいのでは?

512 :デフォルトの名無しさん :04/09/08 14:05
なにが?

523 :デフォルトの名無しさん :04/09/08 14:38
>>512
10年以上昔から定期的に話題になる、いい加減にしろ
まああれだ。よっぱらいは消えろ。と言うことだ。
529513:04/09/08 14:46
>>523
解説ありがとうございます。

>>525
malloc二回のコードは知ってますが
ぱっと見、分かりやすいと思われる方を書きました。

530523:04/09/08 14:47
うぃっす、平日昼間から酔っぱらうのは最高に気分いいっす
寝ます(デスマ明け〜)
#マ板ねただな、こりゃ
531523:04/09/08 14:56
>>527
ワロタ

おっと失礼、酔っぱらいは消えます
532デフォルトの名無しさん:04/09/08 18:24
for文のカウント変数の値を戻り値にする自作関数がわかりません。
もともとカタチで憶えてループさせるパーツ程度にしか扱った
ことないので。

>>532
int func () {
int i;
for (i = 0; [なんたらかんたら]) {
[適当な処理]
}
return i;
}

……じゃないの?
534デフォルトの名無しさん:04/09/08 18:52
#include <stdio.h>
int retusu(char *mojiretu)
{
int i;
for(i=0;i<10;i++)
{
if(*mojiretu=='\0')break ;

*mojiretu++;
}
return i;
}

int main(void)
{
int mojisu;
char *mojiretu;

printf("文字列を入力してください。\n");
scanf("%s",mojiretu);

mojisu=retusu(mojiretu);

printf("文字数は%dです。\n",mojisu);

return 0;

}
これの構文の間違いを指摘してください。
535デフォルトの名無しさん:04/09/08 18:58
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
536デフォルトの名無しさん:04/09/08 18:58
こんばんは。質問があります(>_<)

√(X2−X1)二乗 +(Y2−Y1)二乗

をプログラムに書くとすると どうなるか教えてくださいm(_ _)m
さっぱり分かりません‥距離の公式なんですが。
お願いしますっ!!

>>534
間違いは無いけど?
>>534
*mojiretu++;

>>536 -> >>535
scanf("%s",mojiretu);
>>534
そのコードは存在自体が無意味
>>532==>>534だとしたら詐欺だ
542デフォルトの名無しさん:04/09/08 19:40
>>538
>>539
仮引数と実引数の変数がいっしょ
と指摘しているんでしょうか?


もともと
//strに入った文字列を一字ずつ表示する

pstr=str;

for(i=0;i<10;i++)
{
if(pstr=='\0')break ;
printf("%c\n",*pstr);
pstr++;
}
を応用させて
カウント変数の値によって
文字列の文字数を表示させるには
どうすればいい?
という考え方を思考錯誤してるのですが。
543デフォルトの名無しさん:04/09/08 19:42
534だと構文コマンドエラーになります。
>>542
>>538 の指摘: 先頭の "*" は無意味。
>>539 の指摘: ふつー、そこでコケる。
545デフォルトの名無しさん:04/09/08 20:17
コケる?

文法は間違ってない気がするが
取り込んだ変数の扱い方?
546デフォルトの名無しさん:04/09/08 20:21
文字列の値が入った変数が
自作関数の処理をえて
戻り値として文字数を出すポインタ変数に
なる仕組みのつもりですが。
文字列型の配列を、プログラムの途中で空にするには
どうしたらいいのでしょうか?
548デフォルトの名無しさん:04/09/08 20:34
>>547
先頭文字を'\0'にする。
>>548
ありがとうございます。strcpyを使えばいいんですよね。
なぜかうまくいかないのですが・・もう少し自分で頑張ってみます。
>>547-549
全然話が噛み合ってないような気がする
>>549
strcpy()を使うまでもないぞ。C言語の文字列は'\0'を終端とみなすから、
先頭が'\0'でさえあればよい。だから例えばchar str[128];とあってこれを
空にするにはstr[0] = '\0';とすれば普通は十分。
文字列型なんか使うから大変なんだよ
>>550
すみません;;
>>552
では何を使えば・・・
>>551
詳細ありがとうございますm(_ _)m
で、やってみたのですが、
例えば6文字目に6がはいっていて、str[0] = '\0';としても
6文字目には6がはいったままですよね?
C言語は'\0'を終端とみなすのは分かるのですが、
これを配列全てが何もない状態?になるようにしたいのです。・・・
>>553
「何もない状態」にする必要性は?
555デフォルトの名無しさん:04/09/08 20:57
>>553
なにもない状態にするのは不可能。
>>553
配列が動的に確保されたものなら free してしまって、
静的に確保されたものならさっさとスコープから抜ける
557551:04/09/08 20:58
>>553
んじゃmemset()をつかったらいい。
>>554
それをいっていませんでしたね、
strに123.456という文字列が入っていたとして、
これを数値に変換して表示し、
次にstrに123.45という文字列を入れて数値に変換して表示しようとすると、
6が残ってしまっているのか、123.46(最後の6を四捨五入したため?)
と表示されてしまって困っていたのです。
説明下手ですいません。。

>>556
動的とか静的といったことも分からない初心者でして・・・
申し訳ありません。

>>557
できました!どうもありがとうございましたm(_ _)m

あ、今考えると123.45の後ろに\0を入れるようにすればよかったのかな・・・?
>>558
おいおい、、、普通は
>123.45の後ろに\0
が文字列を入れるって事だろ
560デフォルトの名無しさん:04/09/08 21:25
文字列から関数へのポインタをひっぱってくることは可能でしょうか?

プラグインのようなものをつくりたいのですが。
>>559
更に説明不足ですみません。。。
str1に123.456000などと入っていた場合に最後の0の部分を切り落として
str2に123.456をstrncpyでコピーして、それをatofで数値に変換して
表示する、そしてそれを違う数値(123.45000など)でも何度も繰り返す、
ということをやっていたのです。
そのため\0が入っていなかったのかな・・・というわけでして
562デフォルトの名無しさん:04/09/08 21:28
>>560
基本的に無理、必要なら必要に応じて情報を埋め込んどく必要がある。
なんか、このスレの人たちはfloat型やdouble型でも==演算子使いそうな気がする…
564デフォルトの名無しさん:04/09/08 21:32
>>562
ありがとうございます.

んーっと, Unix 上での開発を考えているのですが...
やろうと思ったら C のインタプリタつくってそれ中継するとか?
>>563
このスレの質問者は、だろ。
>>564
他のスレできけ
>>563
float型やdouble型で==演算子使っちゃいけないのですか?

普通にわかんなくて凹む
568デフォルトの名無しさん:04/09/08 21:38
>>567
そう言ったら、「馬鹿か?」とここの住人に言われた。
>>567
C言語では許可されているけれど、数学的に実数がぴったり合うということはほとんど
ありえないことなのです。
だから、実数型で==演算を許可していない言語も存在します。
コンピュータの中ではビットがぴったり合うことはありますが、本来の意味から
したらするべきではないことです。
>>569
ちょっとちゃうだろ。

int main(){
float a;
a = 1.41421356;
if (a == 1.41421356 )
printf("%s","OK");
else
printf("%s","NG");
return 0;

}

@Borland C++ 5.5.1
浮動小数点を勉強するといい
>>570
この場合はfloatの有効桁数が7桁なので桁落ちした、
そういう場合があるからfloat型などで==を使うときは
気をつけなきゃいけないってことですかね
>>572
No
うほっ・・
>>567
比較するときは対象を演算してはいけないという事です。
あえて演算をするケースで考えるなら不動点を探すときには便利です。
これは奥村センセのCのアルゴリズム本が参考になります、収束判定が見事です。
上手に使えば非常に有用です。
>>575
本当はそんなときでも<とか>を使うべきなんだけど、==を使った方が楽だからね…
実際は使っちゃうよね
577デフォルトの名無しさん:04/09/08 22:12
質問です。
C言語で8バイトの整数型を使いたいときって何を使えばいいのでしょうか?
具体的には4バイトを超えるアドレスを格納しておくために使います。
使わないよ
>>576
ある数列が単調増加で上界があるとき、その差分が単調減少ならば必ず上限が存在して必ず停止します。
>>577
自分の言語の型くらい把握なさい
 「_ ̄フ  ノ^ー┐ ///////////ノ/
 ,-、二、 ーク /  7_/////////^
 `ー‐‐'  `ー'     ///////し
   _l^l_  i^i i^i   ///////
  / ,--┘ U ノ |  //////^
  !__ニコ  lニ.ノ    7///    _,,.. . __
 __l^l__へ  i^i i^i  //^    .. _  `ヽ
 ゙┐r┐T゙ ∪ ノ |  |/     /::/.┬".)   l
  く,ノr'_,ノ  lニ.ノ   7    _iゞ/イ。_ノ    _r'''、
   |    ,へ ,ヘ /    / ニ-''^\¨   ∠.} l
   |    `゙ / / |.   |l、ヾ⌒-|  u  r_ノノ "
   |    ヾ二ノ  |    ヽ |`´_,--|  i、ニイ
   |    /,ニ^\. |     \l<-ニフ ,ノ ,. \、'
  | | | |  | しリj |  \    \ ̄ ,/ノ/ , | Z
  ゚ ゚ ゚ ゚  `ー" ー'  〔      / ̄/ '", /// ,.
>>581
違う
583デフォルトの名無しさん:04/09/08 22:19
>>580
8バイトってdoubleとか_int64しかみつからないのですが・・・。
>>583
アドレスがメモリアドレスのことなら、ポインタ使えば?
585デフォルトの名無しさん:04/09/08 22:34
>>584
それが、足したり引いたりしなきゃいけないんですよ。
アドレスを足したり引いたりって珍しいね
>>585
バラバラにしてunsigned charに格納して計算するのが良いのでは。
C99規格にあるサイズ規定のある整数のtypedefを取りあえず定義しておいて対応されたら、
ほいさっさも良いかと。
対応済みなら使っちゃえ。
ポインタ使うか、移植性を気にするのならlong longでいいだろ。
589577:04/09/08 23:14
みなさんレスありがとうございます。
調べてみた結果、どうやらunsigned long long int が使えるようです。
ありがとうございました。

・・・それにしても長いですねw
590577:04/09/08 23:16
もうしわけございません。
unsigned long long int の存在を知ったのは>>587-588さんのおかげです。
ありがとうございました。
long long ago...
592デフォルトの名無しさん:04/09/08 23:20
ライディーン
593デフォルトの名無しさん:04/09/08 23:25
スレ違いの質問になるかも知れないんですが、
プログラムに自信のある方って、「こんな感じのプログラムを作ってください」と、
言われたら、どんな感じでプログラムの書くんですか?どんな感じって抽象的なんですが、
例えば・・・これを作ってくれって言われたら即行ソースが思いつくとか・・・まぁ、
そんな感じで教えて下さい!
感じるな、考えるんだ。
>>593
マ板で聞けばいいのに

ソースというか完成したイメージが浮かぶ
それに沿って手を動かすだけ
596デフォルトの名無しさん:04/09/08 23:34
天才は寝ている間に頭の中にできあがるそうだ。
597デフォルトの名無しさん:04/09/08 23:37
明け方の早朝覚醒しかかったボケ頭でけっこう思いついたりすることはある
そのほとんどが当日のうちに「最大のネック」を発見することになるが・・・
598デフォルトの名無しさん:04/09/08 23:50
>>593
「(・A・)←こんな感じのプログラムを作ってください」ときたら、
こっちからも「(´・д・`)←こんな感じでどうですか?」ってプロタイプを出してやるしかねぇだろうな。

んで、相手から「(´・ω・`)←いえいえやっぱりこんな感じにしてもらいたいんですが」ってきたら
「(・A・)←アレアレはじめはこうだっていってたじゃないですが」って返したら
相手から「実は(・A・)と(´・ω・`)でどちらにしようか決めかねてて・・・」ときたら

ここで相手といっしょに「( ´∀`)アハハハハ」と笑える奴が最強のプログラマだろうねw
ぶっちゃけどんなにプログラムを組む自信をつけてもここで笑えない奴は
いつまでたっても自信はつかないw
599デフォルトの名無しさん:04/09/09 00:02

じゃあ、俺はダメだ。
最初こういってた、ということにこだわる。
はっきりさせてくれ、と真顔でいいたくなる。
慇懃無礼な態度になってくる。
丁寧語のなかにも怒りの感情が
込上げて来る。


そんな僕ですが。
仕様凍結日付設定
仕様変更別料金
ただし作成時に発覚した仕様上の不具合修正は除く
601デフォルトの名無しさん:04/09/09 00:13
>>599
こいつとケンカになるとデート代が、クルマのローンが・・・
仕事でなきゃとっくに鼻ぶっつぶしてるぜ (^_^)ニコニコ
そろそろスレの趣旨に帰ろう
なんだっけ。
604デフォルトの名無しさん:04/09/09 00:19
>601

はあ?
鼻ぶっつぶす?

どういう意味だ。
この野郎。
  三|三
  イ `<             ,..-──- 、         _|_
   ̄             /. : : : : : : : : : \        |_ ヽ
   ∧           /.: : : : : : : : : : : : : : ヽ      (j  )
   /  \        ,!::: : : :,-…-…-ミ: : : : :',
              {:: : : : :i '⌒'  '⌒' i: : : : :}     _ヽ_∠
  └┼┘          {:: : : : | ェェ  ェェ |: : : : :}       lニl l |
.   |_|_|  , 、      { : : : :|   ,.、   |:: : : :;!      l─| l 亅
   __   ヽ ヽ.  _ .ヾ: :: :i r‐-ニ-┐ | : : :ノ        _
    /     }  >'´.-!、 ゞイ! ヽ 二゙ノ イゞ‐′      l  `ヽ
   ´⌒)    |    −!   \` ー一'´丿 \       l/⌒ヽ
    -'    ノ    ,二!\   \___/   /`丶、      _ノ
        /\  /    \   /~ト、   /    l \
       / 、 `ソ!      \/l::::|ハ/     l-7 _ヽ
      /\  ,へi    ⊂ニ''ー-ゝ_`ヽ、    |_厂 _゙:、
      ∧   ̄ ,ト|    >‐- ̄`    \.  | .r'´  ヽ、
     ,ヘ \_,. ' | |    丁二_     7\、|イ _/ ̄ \
     i   \   ハ       |::::|`''ー-、,_/  /\_  _/⌒ヽ
606デフォルトの名無しさん:04/09/09 00:30
>>599
こいつとケンカになるとデート代が、クルマのローンが・・・
仕事でなきゃとっくに鼻ぶっつぶしてるぜ (^_^)ニコニコ

仕事でなきゃブチ殺してるのはてめえみたいな奴だ。
なにがデート代だ、車のローンだ。
そんなもんがてめえの自信の裏ずけか。
心底ブチ殺してやりたくなるぜ。
この野郎。


607デフォルトの名無しさん:04/09/09 01:35
デート代なんかでていかねえ、車もねえ、
心底ブチョ殺してめえこのやろう。
デート代なんかでていかねえ、車もねえ、
心底ぬるぽしてめえこのやろう。
609デフォルトの名無しさん:04/09/09 06:18
基本的な質問で済みません。画像ファイルの提示方法を教えて下さい。
Macのコードウォーリア―が作業環境です。
C + 標準ライブラリ程度では画像の表示はできかねます。

>>1
> GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
をちゃんと読んで下さい。
そもそも「提示」ってなんだ?
612デフォルトの名無しさん:04/09/09 08:43
構造体の型をユーザ関数の型とる事でどういう効果?があるのか、わかりません。
すみません。こんな質問をして。
ですが、マジでわからないので教えて下さい。
お願いします。
5回読んだけど、解読できなかったよ・・・
>>612
もしかして、こういう事?

int userfunc(void);

struct hoge{
   int (*pfunc)(void);
    :
}foo;

foo.pfunc = userfunc;


615612:04/09/09 09:11
>>614
struct hoge{
int a;


};

hoge* AAA(hoge** pphoge・・・)
{
   ・
   ・
   ・
}
こんな感じです。
このときの関数の型です。
>>615
そういう仕様の関数ってだけでしょ。
617615:04/09/09 09:16
そういう仕様の関数とはどういう事なんでしょうか?
たぶん、そこが解ってないんだと思います。
お願いします。
struct hogeへのポインタのポインタを引き数として受け取り、
struct hogeへのポインタを返すってだけでしょ。
構造体が何か判ってないとかポインタとは何か判ってないなら初心者スレへどうぞ。
>>617
それだけの情報でわかる訳ないやん。
hoge**を引数にしているって事は、AAA()の中でインスタンス確保してるんかな。
620617:04/09/09 09:24
なるほど!理解できました!!
>>618さん ありがとうございました☆
ポインタは自分なりに理解してると思うのですが、
なにぶん、初心者で、構造体っていうのがわかっていなかったもので・・・。
ですが、わかりやすい解説ありがとうございました!
617の質問の意味、そして何が理解出来て解決したのかが
サパーリわからないオレはアフォですか?
>>621
安心しろ。俺もわからん。
しかしCスレに常駐してしょうもないレスばっかつけてる奴等って
生命削ってまでやることなのか?
>>615
ああ、構造体とかの型が理解できてなかったのか。
やっとわかたよ。。。orz
>>623
いや、別に生命削ってはないけど、今日は偶々暇なんだよ。
>>618
えー!?構造体関係ないやん・・・
627626:04/09/09 09:46
レス番間違えた。
>>620
pow overflow の回避策を教えてください。
x * log(y) < log(DBL_MAX) のときpow(x,y)が成立と思う
630デフォルトの名無しさん:04/09/09 14:49
質問です。
ファイルから数値をfloat型配列に一つずつ(改行で区切って)読み込むにはどうしたらいいでしょうか?
文字列をChar型配列に読み込むのはできるんですが、数値はどうしてもできません。
宜しくお願いします。
char配列に読み込んだのなら、それをstrtodにかけるとか。
fgetsしてsscanfじゃ駄目?
atoiは?
getsでええやん
635デフォルトの名無しさん:04/09/09 15:10
手抜きならfscanf
/*
in test.dat
-----------------
0.1
2.22222
3.141592653589793
-----------------
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#define IFILENAME "test.dat"
#define DAT_MAX 256
int main( void ) {
int i;
float dat[DAT_MAX];
char str[256];
FILE* fi;
if ( ( fi = fopen ( IFILENAME, "r" ) ) == 0) {
perror( IFILENAME );
exit(0);
}
for( i = 0; fgets( str, DAT_MAX, fi ) != NULL; i++ ) {
dat[i] = atof(str);
printf("%f\n", dat[i]);
}
return 0;
}
637デフォルトの名無しさん:04/09/09 15:17
perrorにerrno.hは必要ない
638デフォルトの名無しさん:04/09/09 16:11
質問です。
WinSock1.1を使用しています。
WinSockは、プロクシサーバーへの接続動作をサポートしているでしょうか?

それともCInternetSessionに変更した方が良いでしょうか?

よろしくお願いいたします。
>>638
ネットワーク関連は以下のスレへ

ネットワークプログラミング相談室 Port10
http://pc5.2ch.net/test/read.cgi/tech/1090385857/
640630:04/09/09 17:17
630です。質問に答えていただきありがとうございました。
もう一つ聞きたいのですが。
例えば以下のようなファイルが会ったとします。
1
2
3

4
5
6

ファイルから数値(文字列)を配列aに読み込んでいき、途中の空白改行を境に
配列b(要するに別の配列)に数値を読み込んでいくにはどうしたらいいのでしょうか?
途中から読み込むというのができなくて困っています。
宜しくお願いします。
>>640
if(str=="\n")
で区切りを見つけて区切るとか。
if(str=="\n\0")
だったかな。
643デフォルトの名無しさん:04/09/09 17:27
このような関数を宣言しているのを見かけたのですが、これはどのような使い方なのでしょうか。

getname(s) char s[][];
{
printf("name: %s",s);
}

何故char s[][]がこの位置にあるのかがわかりません。
またスコープの範囲はどのようになるのでしょうか。
>>643
古い書き方。
getname(char s[][])
と同等。
>>641-642
そんな餌に
 \(・(ェ)・)クマー
646デフォルトの名無しさん:04/09/09 18:30
647デフォルトの名無しさん:04/09/09 19:22
>>640
fgets(str, 100, fp);
for (i=0; str[i]!=0; i++) {
if (str[i]=='\r' || str[i]=='\n')
break;
}
if (i==0)
何かの処理;
648デフォルトの名無しさん:04/09/10 01:04
初めまして、現在マルチメディアタイマーを使用しているのですがVisual C++であれば
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
で上手く起動するのですがBorland C++だとうまくいきません。教えてください、できる限り具体的に
お願いします。
何がうまくいってないのか具体的に書かないと釣りと間違われるぞ
>>648
Googleで"Borland C winmm.lib"などのキーワードで
ていうかスレ違いだ
651デフォルトの名無しさん:04/09/10 01:27
strtok()以外にもリエントラントでない標準関数ってありますか
>>651
検索すればすぐ見つかったが。
いっぱいあったよ。
>>652
何の意味?それ全部と言うの?
655デフォルトの名無しさん:04/09/10 01:40
localtimeとかstrerrorとか
mblenもそうか。
>>652
>>653
ありがとうございました

個人的にはstrtol()の他にrand()位しか使用しそうもないので
それだけ気をつけてみます
657デフォルトの名無しさん:04/09/10 01:43
asctimeもだ
内部にバッファを持ってる関数は全てか。
>>658
違うの?
errnoを使うもの全て
661デフォルトの名無しさん:04/09/10 07:35
関数の引数に、ハンドラを渡すことが多く見られるけれど、
ハンドラを引数にすることのメリットはどんなことなのでしょうか?
>>661
人に判る言葉で
663デフォルトの名無しさん:04/09/10 09:05
//テキストの表示
HDC hdc;
  LPTSTR lptStr = TEXT("111");
hdc = GetDC(hWnd);
  TextOut(hdc , 0 , 0 , lptStr , lstrlen(lptStr));
  ReleaseDC(hWnd , hdc);

これだと111が表示されるのですが

変数Aの内容を表示させたい時はどうすればいいのでしょうか?
>>663
なんで、このスレにくるかなぁ…

【初心者歓迎】C/C++室 Ver.9【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1094494997/
>>663 言っている事の意味がよくわからん…
char s[] = "1", t[2];
int i = 1;
HDC hdc = GetDC(hWnd);
sprintf(t, "%d", i);
TextOut(hdc, 0, 0, t, strlen(t));
TextOut(hdc, 0, 0, s, strlen(s));
ReleaseDC(hdc);
666デフォルトの名無しさん:04/09/10 12:03
>>649
リンクの仕方がよくわかりません。Visual C++の場合プロジェクトの設定でライブラリを
追加できるのですが,Borland C++ではどのように行えばいいのでしょうか。初心者ですいません。
>>666
タダで使えるBorland C++ Part4
http://pc5.2ch.net/test/read.cgi/tech/1091066805/l50
668デフォルトの名無しさん:04/09/10 12:27
Borland C++は持っています。
質問の答えが掲示板に載っているということですか?
669デフォルトの名無しさん:04/09/10 12:27
>>667
Borland C++は持っています。
質問の答えが掲示板に載っているということですか?
スレ違い、ということです。
「C言語」そのものの話じゃないでしょ?
すげぇ天然だな、つーかバカだな。
>>669
貴方はこのスレにこなくて良いということです。
もっというと、貴方はいらん子というわけです。
673663:04/09/10 14:33:58
>>664
誘導ありがとうございます
そっちで聞いてみます
674デフォルトの名無しさん:04/09/10 16:17:43
素直でいい子じゃん
675デフォルトの名無しさん:04/09/10 16:31:48
>>674
……。
676デフォルトの名無しさん:04/09/10 18:47:29
>>675
……。
677デフォルトの名無しさん:04/09/10 19:48:11
mallocで確保した領域の大きさをプログラム中で得るにはどうしたらいいんでしょうか?
678デフォルトの名無しさん:04/09/10 19:51:35
>>677
malloc する時点で自分で把握しておくしかない。
malloc(N*sizeof(type)) とかする時に、N*sizeof(type) の値をグローバル変数などに保存。
679デフォルトの名無しさん:04/09/10 20:27:51
質問です。

/*クラップスゲーム*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int rollDice(void);

main()
{
int gameStatus, sum, myPoint;

srand(time(NULL));
sum = rollDice();/*最初のサイコロ振り*/

switch(sum)
{
case 7: case11:/*最初のサイコロ振りで勝つ場合*/
gameStatus = 1;
break;
case 2: case3: case12:/*最初のサイコロ振りで負ける場合*/
gameStatus = 2;
break;
default: /*持ち点を記憶する*/
gameStatus = 0;
myPoint = sum;
printf("持ち点は%d\n",myPoint);
break;
}

680デフォルトの名無しさん:04/09/10 20:28:45
続き
       While (gameStatus == 0)/*サイコロを振り続ける*/
{
sum = rollDice();

if (sum == myPoint)/*勝ち点が出たので勝ち*/
gameStatus = 1;
else
if (sum == 7)/*7が出たので負け*/
gameStatus = 2;
}

if (gameStatus == 1)
printf("プレイヤーの勝ち\n");
else
printf("プレイヤーの負け\n");

return 0;
}


681デフォルトの名無しさん:04/09/10 20:29:08
また続き

int rollDice(void)
{
int die1, die2, workSum;

die1 = 1+(rand() %6);
die2 = 1+(rand() %6);
workSum = die1 + die2;
printf("プレイヤーがサイコロを振った。出目は%d + %d = %d\n",die1, die2, workSum);
return workSum;
}

をコンパイルしようとすると「error C2143: 構文エラー : ';' が '{' の前にありません。」と出ます。
何処が間違ってるのでしょうか?
682デフォルトの名無しさん:04/09/10 20:32:13
>>681
While って何だ?whileだろ
683デフォルトの名無しさん:04/09/10 20:34:41
>>681
-       While (gameStatus == 0)/*サイコロを振り続ける*/
+ while (gameStatus == 0)/*サイコロを振り続ける*/
684デフォルトの名無しさん:04/09/10 20:35:19
ああ!
ありがとうございました。
もう逝きます。すいませんでした。
685デフォルトの名無しさん:04/09/10 20:35:28
エラーメッセージくらい読めてください。
686デフォルトの名無しさん:04/09/10 21:38:16
どこのコンパイラ使ってるのか知らんが、
ちゃんとエラーの場所も教えてくれるやつと交換しろ。
687デフォルトの名無しさん:04/09/10 21:51:31
>>686
知らないなら余計な事言わなきゃいいのに。
688デフォルトの名無しさん:04/09/10 22:03:30
( ´,_ゝ`)プッ
689デフォルトの名無しさん:04/09/10 22:12:00
あの、漠然とした質問で申し訳ないですが、
よく「floatは極力使うな」と言われます。
処理する内容にもよるのでしょうが、float型変数一個使ったぐらいで
通常のどれくらい処理落ちするものなのでしょう?
690デフォルトの名無しさん:04/09/10 22:16:30
>>689
通常もクソも無い。
気になるなら自分で計れ。
691デフォルトの名無しさん:04/09/10 22:27:35
>>689
Cではあちこちfloatからdoubleへの格上げされる機会があってその分オーバーヘッドがかかるから遅くなると言われるけど、どのくらいかと聞かれれば>>690の一言に集約される。
692デフォルトの名無しさん:04/09/10 22:38:51
>>689
80486SXを使っているパソコンだったら float よりも double の方が遅い。
693デフォルトの名無しさん:04/09/10 22:48:35
>>689
691が言っているような事情を知ったうえで、そのうえで690が言っているような検討をすればいい。
その検討の結論が「極力使うな」とか言うDQNと一致しなくても気にする必要はない。
694デフォルトの名無しさん:04/09/10 22:50:04
gotoと同じ
695デフォルトの名無しさん:04/09/10 22:52:45
>>694
じゃ、使っていいんだなw
696デフォルトの名無しさん:04/09/10 22:57:10
>>695
レベルの低いヤツだ
697デフォルトの名無しさん:04/09/10 22:59:07
SetWindowsHookExを使ってコピーされたってのを知りたいんですけど
WH_CALLWNDPROCRETを使ってWM_COPYを見ていればいいんですか?
698デフォルトの名無しさん:04/09/10 23:00:37
>>697
ここはそんなスレじゃない
699デフォルトの名無しさん:04/09/10 23:03:20
>>696
機械よりがどうかしたのか?
700697:04/09/10 23:04:09
>>698
わかりました
701689:04/09/10 23:16:51
自分は時間を計るといってもclockぐらいしか知りません。
それでやってみたのですが、処理時間に差は全くと言って良いほどありませんでした。

>「極力使うな」とか言うDQNと一致しなくても気にする必要はない。
そのDQNは先生であり・・・
gotoなど絶対に使うなと、教えられてきました。
その所為でしょうか、floatを一つ使うごとにとても気になってしまっていたのです。

みなさまの意見は大変参考になりました。
ありがとうございます。
702デフォルトの名無しさん:04/09/10 23:21:56
>>701
知らなくていいと言うクルクルパーと、
実測もせずに教わったとおりの受け売りを繰り返すだけの永久初心者の轍を踏むな。
知るべきことは知り、現実を見て判断していればいい。要はそういうことだ。
703デフォルトの名無しさん:04/09/10 23:23:36
レベルとは無関係、こだわりを忘れた奴に多くを期待しない。
704デフォルトの名無しさん:04/09/10 23:26:49
本当に速度を気にして使うなとおっしゃられたのでしょうか?
705デフォルトの名無しさん:04/09/10 23:34:16
なんせ「極力」だからな・・・
706デフォルトの名無しさん:04/09/10 23:47:58
> gotoなど絶対に使うなと、教えられてきました。
goto自体は絶対に使ってはならないことはない。
ただし、使うときはかなり厳しめの条件付きになる。
使わないに超したことはない。
707デフォルトの名無しさん:04/09/10 23:54:03
>>706
具体的に条件を示さずに
>使わないに超したことはない。

いきなりこういう結論だけを異様な目つき言う手合いはガイキチ
708デフォルトの名無しさん:04/09/10 23:57:09
>>707
それはガイキチとは言わず、低能といいます。
709デフォルトの名無しさん:04/09/10 23:59:10
纏脳
710デフォルトの名無しさん:04/09/11 00:00:45
DQNに危険性を教えるのは時間と労力の浪費なので
とりあえず「絶対使うな」と教えこむことはあるだろう
711デフォルトの名無しさん:04/09/11 00:02:21
>>710
そんなDQNにC言語教えるほうがおかしいんだよ
712デフォルトの名無しさん:04/09/11 00:02:42
>時間と労力の浪費
人にものを教える資質がない証拠
713デフォルトの名無しさん:04/09/11 00:04:05
>>712
おまえは人にものを教えた経験があるのか?
どうやってもどうしようもないやつも世の中にはいる
714デフォルトの名無しさん:04/09/11 00:04:55
>>713
とりあえず「絶対使うな」と教えこんだりしない
715デフォルトの名無しさん:04/09/11 00:08:53
A gotoを絶対つかうな!
B 何故ですか?
A 知らん!オレもそう教わったからだ!
716デフォルトの名無しさん:04/09/11 00:15:15
今までgoto使ったことないけど、どういうとき使うの?
717デフォルトの名無しさん:04/09/11 00:20:17
718デフォルトの名無しさん:04/09/11 00:24:18
例えばものすごい深いネストから一気に抜けるときとか。

for (条件A) {
for (条件B) {
for (条件C) {
.
.
.
if (例外) {
goto jump;
}
}
}
}

jump:
719デフォルトの名無しさん:04/09/11 00:24:53
>>716

while (hoge) {
 switch (foo) {
 case bar:
  〜;
  ●
 }
}


例えば●から○へ行きたい(多重breakしたい)ときとか
720デフォルトの名無しさん:04/09/11 00:34:23
フラグを使うよりマシなとき
721デフォルトの名無しさん:04/09/11 00:38:18
>>716
ループはwhileやforよりもif,gotoを使う方が速くなる。
722デフォルトの名無しさん:04/09/11 00:41:21
>>721
そんなエサではクマも釣れない
723デフォルトの名無しさん:04/09/11 00:47:28
gotoってjmpだもんね。余計なものがついてない。
724デフォルトの名無しさん:04/09/11 00:55:10
gotoを使うと最適化を阻害して却って遅くなることもある。
725デフォルトの名無しさん:04/09/11 00:56:27
726デフォルトの名無しさん:04/09/11 01:07:42
>>725
コンパイラは、for文、while文の動作は大抵の場合この変数をよく参照するだろう
という推論を元に値をレジスタに格納したりするんじゃなかったけ?
(メモリからレジストリにロードするのって結構コストがかかるような気が。。。)
そうなると、goto文にしちゃうとそういう最適化が有効にならずに結果として
出力されるコードが遅くなるなんてこともあるような。
まっ、何だかんだ言ってもさまざまなケースでの実測知に勝るものはものはないけど。。。
727デフォルトの名無しさん:04/09/11 01:11:57
>>726
一度アセンブリで出力してみて、どっちが効率的か見て見ればいいんじゃないかな
728デフォルトの名無しさん:04/09/11 01:18:50
おまえらなぁ最適化だの速度だのは標準Cと関係無いんだよ
729デフォルトの名無しさん:04/09/11 01:23:32
>>726
レジストリ・・・
730デフォルトの名無しさん:04/09/11 01:25:00
>>728
アルゴリズム
731デフォルトの名無しさん:04/09/11 01:25:16
レジストリじゃなくてレジスター。
Windowsに毒されているなぁ〜
732デフォルトの名無しさん:04/09/11 01:25:48
>>730
それが何か?
733デフォルトの名無しさん:04/09/11 01:27:04
>>732
あ?
734デフォルトの名無しさん:04/09/11 01:29:10
>>726
空きレジスタの数よりもネスト数が深いループからgotoで抜けるのと1段ずつbreakするのとどっちが早いと思う?
735デフォルトの名無しさん:04/09/11 01:45:27
そもそもそんなに深いネストが必要になるようなプログラムは
設計が悪いのではないのか
736デフォルトの名無しさん:04/09/11 02:13:34
>>731
毒されているというより、基礎知識があやふやなだけでは?
737デフォルトの名無しさん:04/09/11 02:16:52
>>735がいいこと言った!
738デフォルトの名無しさん:04/09/11 02:33:31
goto嫌ならreturnすれば良いじゃん。
そのネストの深い部分を関数にまとめて、returnにしちゃうの。
gotoは必要なし。
739デフォルトの名無しさん:04/09/11 02:35:35
>>738
そして、速度の低下を防ぐためにグローバル変数を使えば完璧だな。
740デフォルトの名無しさん:04/09/11 03:03:01
>>739
高速オナニーソース和えか?
741デフォルトの名無しさん:04/09/11 03:15:39
じゃ俺ループをインライン展開しようっと
742デフォルトの名無しさん:04/09/11 05:12:11
質問です。
Cのプログラムをコンパイルすると
scm.c:4 から include されたファイル中:
scm.h:1:2: 警告: null 文字は無視されました
scm.h:1:3: 無効なプリプロセスディレクティヴ #i
scm.h:1:4: 警告: null 文字は無視されました
scm.h:1:6: 警告: null 文字は無視されました
のような警告がヘッダファイルの全行にわたって出てくるんですが
この警告の意味がよくわかりません。
ソースにnull文字なんて入れた覚えはないんですが。。
どなたかご教示お願いします。
743デフォルトの名無しさん:04/09/11 05:48:21
>>742
自己解決しました。
文字コードがutf-8になってた。。orz
744デフォルトの名無しさん:04/09/11 09:01:42
>>735
空きレジスタが少ない状況なんてそこいら中にあるだろ
ネストが何段になったら設計が悪いのかが処理系ごとに異なるとでも言いたいのか?
そんなことより「最適化の阻害」という問題について何か言ったらどうなんだ
745デフォルトの名無しさん:04/09/11 11:35:45
ソケットで通信するプログラムを書いているのですが,
read(sock,buf,BUFSIZE);
とすると行単位でしか読み込みができません.複数行の受信データを読み出そうと
for(;;){
x = read(sock,buf,BUFSIZE);
if(x == -1 || x == 0) break;
strcpy(buf2[i][0],buf);
memset(buf,0,BUFSIZE);
i++;
}
とすると,2度目のreadでなぜかプログラムが停止してしまいます.
(つまり1行目しか読み出せません)
解決策は無いでしょうか...
746デフォルトの名無しさん:04/09/11 11:39:32
>>745
送信側の問題と予想してみる。
あたりだったら何か記念品をください。
747デフォルトの名無しさん:04/09/11 11:42:50
748デフォルトの名無しさん:04/09/11 11:43:34
>>746
SMTPサーバ相手に通信しているのですが,telnetからアクセスして
EHLOした時の受信内容と,自分のプログラムからEHLOした時とで,比較しているので
送信側の問題ではなさそうな気がします.
220 hoge.hoge.hoge ESMTP
220-8BITMIME
・・・・・
220 ETRN
と帰ってくるのが最初の1行しか読み込めない状況です.
749デフォルトの名無しさん:04/09/11 11:55:43
printf("%d\n"),dとかと入力しても
50\nとしかでてこないんです。なんで?
Xcode1.1でやってます。OS10.3.5です。
750デフォルトの名無しさん:04/09/11 11:57:50
printf("%d\n"),d
でコンパイル通るの?
751デフォルトの名無しさん:04/09/11 12:08:39
>>750
後ろにセミコロンさえ付いていれば文法的には問題ない。

…つか、もうカンマ演算子なんか廃止すりゃあいいのに。
752749:04/09/11 12:14:33
入力したのは;もついてます。
でも実行結果だと50\nってでてくるんですよ。
753デフォルトの名無しさん:04/09/11 12:17:43
#include <stdio.h>
void main()
{
char buff[1000];
while(fgets(buff,sizeof(buff),stdin)!=NULL){
char name[1000];
int point;
if(sscanf(buff,"%s %d",name,&point)!=2)
break;
printf("%s %d\n",name,point);
}
}
というプログラムを実行すると"stdinは定義されていません"とエラーが
通知されるんですが、stdinはどのように定義すれば使えるようになるんでしょうか?
くだらない質問ですが宜しくお願いします。
754デフォルトの名無しさん:04/09/11 12:19:44
>>749
printf("%d\n", 51);
755デフォルトの名無しさん:04/09/11 12:22:53
Ultra-C Proを使って、ある計算プログラムを組んだのですが、
配列の大きさにNを定義し、(例えばA[N]のようにして)
Nを1000と置けば正常に動いてくれるのですが、
Nを1500とか2000と置くと全く関係なさそうなscanf文の「'&' の演算項が不当」
と出たり、「'fprintf' のファイルポインタ値が不当」というエラーが出ます。
また、Nを10000と置くと「配列のサイズが大き過ぎる」
Nを100000と置くと「配列のサイズが不当」というエラーが出ます。

これはUltra-C特有のものなのでしょうか?
見直すべき箇所がありましたら教えてください。
756デフォルトの名無しさん:04/09/11 12:32:42
int型の配列長を取得することはできますか?
757デフォルトの名無しさん:04/09/11 12:33:17
>>756
はい。できます。
758デフォルトの名無しさん:04/09/11 12:33:39
>>755
でかい配列をローカルに取らない。
759デフォルトの名無しさん:04/09/11 12:35:35
>>757
How can i do that?
760デフォルトの名無しさん:04/09/11 12:36:16
>>759
int i[100];
size_t s;
s = sizeof(i) / sizeof(int);
761デフォルトの名無しさん:04/09/11 12:42:10
>>760
すいません、ポインタで渡した先の関数では取れますか?
762デフォルトの名無しさん:04/09/11 12:46:11
>>761
取れません
763デフォルトの名無しさん:04/09/11 12:47:24
>>761
ですね、どうもです
764デフォルトの名無しさん:04/09/11 12:55:38
#include<stdio.h>
#define TYPE int
int main(){
printf("sizeof(TYPE)==%d\n",sizeof(TYPE));
}

sizeof(TYPE)==4
と表示されてしまします。これはどうしてでしょうか。
Cの文字列中はマクロ変換をしてくれないのでしょうか。
765デフォルトの名無しさん:04/09/11 12:56:48
たびたびすいません。
int配列に要素を追加するところで躓いてます。
mallocでlength+1を確保してるんですが、プログラム終了時に鰓はかれます。
ド素人が躓きそうな箇所を教えてください
766デフォルトの名無しさん:04/09/11 12:59:19
>>765
配列には要素を追加できません。
767デフォルトの名無しさん:04/09/11 12:59:47
>>765
っていうか、どんなソース書いてるか見せてくれる?
768デフォルトの名無しさん:04/09/11 13:00:20
>>764
そのとおり
769753:04/09/11 13:01:44
どなたか答えてください。
よろしくお願いします。
770デフォルトの名無しさん:04/09/11 13:03:41
>>768
ということは、プリプロセッサは、""で囲まれた場所とそうでない場所を
識別して、処理しているということですね。ありがとうございました。
771デフォルトの名無しさん:04/09/11 13:04:29
>>769
stdio.hの中で定義されてるはずなのにねぇ
なんでだろ
もしかして標準入力がない環境?
772753:04/09/11 13:08:52
>>771
おそらくあると思うんですが・・
でも、↑のプログラムで間違いはないって事ですよね。
とりあえず、それだけ知りたかったので有難うございました。
773765:04/09/11 13:14:40
>>767
素人コードですが・・・。
ダメだししてください

void main(void){
int *TestData,length=0;
length = AddNewCoefficient(TestData, length, 0x1222221); }
//配列に係数を挿入する
int AddNewCoefficient(int *Data, int length,int inData){
length=Add32Degree(Data, length);
*(Data+length-1)=inData; return length;}

int Add32Degree(int *Data, int length){
//無限ループすると落ちます。
//引数に現在の長さ(配列の要素数)を渡してください
//戻り値は作成した配列の長さ or FALSE
int i,*tmp;
tmp=(int*)malloc(sizeof(int)*length);
if(length>MAXDATASAFTY) return FALSE;
for(i=0; i<length; i++) tmp[i]=*(Data+i);
free(Data);
Data = (int *)malloc(sizeof(int)*(length+1));
for(i=0; i<length; i++) *(Data+i)=tmp[i];
return(length+1); }
774765:04/09/11 13:15:45
>>773
インデントされない欝
775デフォルトの名無しさん:04/09/11 13:25:12
>>773
reallocはお嫌い?
776デフォルトの名無しさん:04/09/11 13:29:36
>>773
気付いた点のみ。
・malloc()したあとにlengthを調べるより、malloc()する前に調べるべき。
・↑こうしてないので、returnの前にfree()が必要。
・正常系でもtmpがfree()されていない。
・ポインタを渡しても、ポインタを得ることはできない。
#void func(int)に整数値を渡しても整数値を得られないのと同様。
#int *を受け取りたいなら、void func(int **)としてやる。
・(どうせ受け取れてないから意味ないけど)Dataもfree()されてない。
・特にそう書きたい理由がないなら、*(Data+i)と書くよりData[i]と書くべき。
・戻り値がFALSEと配列の長さと区別できなくなる。
#FALSEが0である前提なら、素直に長さ0を返すべき。
・戻り値がFALSEだった場合に、書き込んではいけないところに書き込んでいる。
777デフォルトの名無しさん:04/09/11 13:31:09
>>773
if(length>MAXDATASAFTY) return FALSE;

tmp=(int*)malloc(sizeof(int)*length);
の前に置いてください

変数と演算子の間にはスペースを置いたほうが見やすいです

free(Data);
Data = (int *)malloc(sizeof(int)*(length+1));

realloc( Data, sizeof(int)*(length+1) );
で書き換えられます
778755:04/09/11 13:31:31
>>758
>でかい配列をローカルに取らない。

どうすればN=100000の配列が作れるようになりますか?
779デフォルトの名無しさん:04/09/11 13:37:15
>>778
staticにするか、グローバル変数にするか
780デフォルトの名無しさん:04/09/11 13:37:45
>>778
えとね、
配列っていうのはスタック領域に確保するものだから、大きさに制限がある。
確保できる大きさはかなり小さいです。
あなたのように大きな領域を使う場合はヒープ領域に確保しないとだめ。
int n[100000];
n[0] = 0;
じゃなくて、
int* n;
n = ( int* )malloc( 100000 * sizeof( int ) );
n[0] = 0;
.....(略
free( n ); //これを忘れてはいけない
としてください。
781デフォルトの名無しさん:04/09/11 13:42:05
>>773
int main(void) {
  int *TestData = NULL, length = 0;
  length = AddNewCoefficient(&TestData, length, 0x1222221);
  return 0;
}

int AddNewCoefficient(int **Data, int length, int inData) {
  int NewLength = Add32Degree(Data, length);
  if (NewLength > 1 && )
    (*Data)[length] = inData;
  return NewLength;
}

//戻り値は作成した配列の長さ or FALSE
int Add32Degree(int **Data, int length) {
  if (length > MAXDATASAFTY)
    return 0;
  *Data = realloc(*Data, sizeof (int) * (length + 1));
  return length + 1;
}
782デフォルトの名無しさん:04/09/11 13:44:30
C限定かというとそうでもないのですがCで作っているのでこちらで質問します。

1つの.cファイルのヘッダファイルはどのくらい必要でしょうか?
やはりそのファイルの関数を呼び出している分+自分の分でしょうか?
それとも、他ファイル分+自分の分だけでいいのでしょうか?

783765:04/09/11 13:44:46
>>775,>>776,>>777,>>781
わざわざすいません、いま試して(+google)みてます
784デフォルトの名無しさん:04/09/11 13:45:29
>>782
同じファイルを使いまわせばいいんじゃない?
785デフォルトの名無しさん:04/09/11 13:47:58
>>782
他のファイルから参照したい関数だけでよい。
786781:04/09/11 13:56:22
>>783
AddNewCoefficientのif (NewLength > 1 && )はif (NewLength > 1 && Data != NULL)の間違いだった。
787765:04/09/11 14:17:46
realloc知りました。
*Data = (int *)realloc(*Data, sizeof (int) * (length + 1));
どうしてもここで引っかかってしまいます。
788デフォルトの名無しさん:04/09/11 14:19:04
>>787
なにが?
789765:04/09/11 14:24:27
>>788
.NET2003(?)のVC++でのデバッグ実行中のエラーです。
//test.exe の 0x00417c52 で初回の例外が発生しました : 0xC0000005: 場所 0xccccccc8 を読み込み中にアクセス違反が発生しました。 。
//test.exe の 0x00417c52 でハンドルされていない例外が発生しました : 0xC0000005: 場所 0xccccccc8 を読み込み中にアクセス違反が発生しました。 。

gcc ver.2.95では通りました。
790デフォルトの名無しさん:04/09/11 14:39:05
>>789
reallocのところにブレークポイントかけて、引数をチェックするとか。
791765:04/09/11 14:57:42
>>789
チェックしていましたが、問題が(見当たりませんでした||見つけられませんでした)。
自己で理解できなかったので、配列をconstで確保、迂回策とします。
realloc、常識を投げてくださった諸先輩方ありがとうございました。
gccで通るので、一人で吊ってきます。

#VC++ and Windowsやっぱりよくわかりません
792デフォルトの名無しさん:04/09/11 15:11:01
>>791
ところでint *TestData = NULLをint *TestData = malloc(1)にしてみるとどうなる?
793デフォルトの名無しさん:04/09/11 15:25:29
おい
mallocとfreeには致命的欠陥がある
newとdeleteを使えおまえら
794デフォルトの名無しさん:04/09/11 15:26:37
>>793
致命的欠陥があるのは貴様の脳ではないのか
795デフォルトの名無しさん:04/09/11 15:28:12
>>794
(  ゚,_ゝ゚)バカジャネーノ
796デフォルトの名無しさん:04/09/11 15:32:11
>>793
こう?
void *new(size_t s) {
 return calloc(1, s);
}

void delete(void *p) {
 return realloc(p, NULL);
}
797デフォルトの名無しさん:04/09/11 15:36:19
>>796
ねえ、それで面白いと思ってるの?
798デフォルトの名無しさん:04/09/11 15:37:03
#define new malloc
#define delete free
799デフォルトの名無しさん:04/09/11 15:38:03
#define new scanf
#define delete printf
800デフォルトの名無しさん:04/09/11 15:39:44
まぁmallocとfreeの致命的欠陥には
頭が相当良くないと気付けないから
おまいらには理解不能だろうよ
801デフォルトの名無しさん:04/09/11 15:40:37
>>800
おまえにしか理解不能
つまらんから直ちに消えろ
802デフォルトの名無しさん:04/09/11 15:43:38
Cスレ
803デフォルトの名無しさん:04/09/11 15:44:15
>>801
はいはい
malloc/freeでプーなコードでも
書いといてください
804デフォルトの名無しさん:04/09/11 15:45:42
>>803
致命的欠陥があるのは貴様の脳ではないのか
805デフォルトの名無しさん:04/09/11 15:46:16
>>804
同意。
806デフォルトの名無しさん:04/09/11 15:46:20
>>804
わからないからって
すぐそうやってごまかすw
807デフォルトの名無しさん:04/09/11 15:47:04
またC++スレの住人が荒らしに来たか
808デフォルトの名無しさん:04/09/11 15:54:11
もしかして本気でC++スレと勘違いしていたんじゃ・・・
809デフォルトの名無しさん:04/09/11 15:54:55
C++スレ住人はあほですか?
810デフォルトの名無しさん:04/09/11 15:55:56
失礼な。ヤツがあほなだけだ
811デフォルトの名無しさん:04/09/11 15:56:42
じゃあ何が致命的欠陥か教えてやるよ
812デフォルトの名無しさん:04/09/11 16:00:24
So, I'll tell you what the fatal flaw is !
813デフォルトの名無しさん:04/09/11 16:05:08
newとdeleteが致命的欠陥を抱えてるのは無視ですか?
814デフォルトの名無しさん:04/09/11 16:13:34
未使用領域は双方向リストで管理されてるんだよ
で、mallocで確保した領域をfreeするとその領域が未使用領域のリストに挿入される

ここでもしその領域の前後も未使用領域だった場合,
未使用領域がひとつの大きな未使用領域としてマージされる
その時に未使用領域を管理する双方向リストのつなぎ変えが起こる

これでどうなるかと未使用領域をつなぐポインタとして
前の未使用領域へのポインタをfd,後の未使用領域へのポインタをbkとすると
fd->bk = bk; と bk->fd = fd; という風にポインタがつなぎ変わる

で,なんとこのfdとbkのポインタ領域ってmallocしたときに
確保した領域と一緒にユーザに割り当てられちゃう
これが超やばい,致命的仕様,セキュリティホール満載
リストの管理領域まで一緒に割り当てちゃうってどんな仕様だよ

頭の回転が速いやつには
あんなことやこんなことができてしまう(((( ´,,_ゝ`)))) ププッ プルプルッ

ってこった
815デフォルトの名無しさん:04/09/11 16:16:00
>>814
へーそうなんだ
御前頭悪いな
816デフォルトの名無しさん:04/09/11 16:17:18
long long x;
int y;

x = 1000 * 2;
y = 1000 / 2;

printf("%d %d\n", x, y);

とやると
200 0
と表示され、y = 0x1000 / 0x2の効果が表れません。
しかし、

x = 1000 * 2;
y = 1000 / 2;
printf("%d ", x);
printf("%d\n", y);

と一回づつ表示するとちゃんと
2000 500
となるんですが、これはどういう違いなんですか?
817デフォルトの名無しさん:04/09/11 16:18:03
>>814
救いようが無い馬鹿だな
お前のところのmalloc/freeの実装なんて興味ないんだよ
818デフォルトの名無しさん:04/09/11 16:18:09
>>814
とくに問題ないんじゃない?
別のプロセスが同一空間にアクセスしてこれるならどうかわからんけど。
819デフォルトの名無しさん:04/09/11 16:19:17
>>816
longlongを%dで出してるから。
820816:04/09/11 16:19:19
ごめん、おれがばかだった。
821デフォルトの名無しさん:04/09/11 16:19:58
>>816
%dはint用。
longなら%ld
long longなら%lld
822821:04/09/11 16:21:08
ああ、それとは関係ないか
823デフォルトの名無しさん:04/09/11 16:24:05
>>817
かなり一般的な実装(  ゚,_ゝ゚)

>>818
これが場合によってはかなりの問題
実はこれをどう利用するかが
一番頭をひねるところなんだけどね

ただこれは自分で気付くしかないね
このスレだけではとても説明しきれないから
824816:04/09/11 16:25:38
たしかにprintf("%lld %d", x, y)だとうまくいきますね。

ただ、2回目(別々に表示)だとうまくいくのかという疑問がムクムクと。。。
printf()内部の話なのかな?
825デフォルトの名無しさん:04/09/11 16:27:02
>>823
それは、プロセス空間が分かれていても問題が起こるってこと?
826デフォルトの名無しさん:04/09/11 16:30:33
>>824
たとえばリトルエンディアンでLonglongの1とIntの2を送ると16進で
0100000000000000 02000000
となり、表示で両方Intと勘違いして
01000000 00000000(以下無視) 02000000
とされ、1 0という表示となる
(かなり用語や数を間違ってるかもしれん)
827755:04/09/11 16:32:19
>>780
>配列っていうのはスタック領域に確保するものだから、大きさに制限がある。
>確保できる大きさはかなり小さいです。
>あなたのように大きな領域を使う場合はヒープ領域に確保しないとだめ。
>int n[100000];
>n[0] = 0;
>じゃなくて、
>int* n;
>n = ( int* )malloc( 100000 * sizeof( int ) );
>n[0] = 0;
>.....(略
>free( n ); //これを忘れてはいけない

これをそのまま入れたら他の行のintが構文エラーしました。
何をどうすればいいのかサッパリ分かりません・・・。
828デフォルトの名無しさん:04/09/11 16:33:40
>>825
起こるというか起こす
別プロセスは関係ない
mallocで確保した領域を
少し工夫してfreeすれば起こせる
829デフォルトの名無しさん:04/09/11 16:35:07
やっぱ池沼か
そんなことできる権限あったらなんでも出来るわ
830デフォルトの名無しさん:04/09/11 16:35:56
酷いOSを使っているんだな
831816:04/09/11 16:38:36
>>826
ちょっとよく分からない単語も混じってますけど、説明ありがとうございます!
分からない単語の意味は調べてちゃんと理解したいと思います。
832デフォルトの名無しさん:04/09/11 16:38:51
>>814
new/deleteを使えば解決するようには読めないけど?
833デフォルトの名無しさん:04/09/11 16:41:31
OS板の貴公子が作っているあれなら起こりうる
834デフォルトの名無しさん:04/09/11 16:45:20
「リトルエンディアン」「ビッグエンディアン」の
リトル、ビッグってのは、何に対してリトル、ビッグなの?
835デフォルトの名無しさん:04/09/11 16:46:27
>>829
自分が理解不能だとすぐ池沼か( ´゚,_」゚)ヒッシダナ
このいつまでも塞がれることのない
本当のfreeセキュリティーホールで
ハックしまくり(((( ´,,_ゝ`)))) ププッ プルプルッ

>>830
犬やフリビが酷いって(´ν_.` )

>>832
実はnew/deleteで解決されるかはまだ検討していない( ´_ゝ`)
836デフォルトの名無しさん:04/09/11 16:46:30
相対的なリトル・ビッグだろ。
837デフォルトの名無しさん:04/09/11 16:47:00
たまご
838デフォルトの名無しさん:04/09/11 16:47:23
Little Endian
Regular Endian
Big Endian
839デフォルトの名無しさん:04/09/11 16:50:34
>>814
ユーザ空間なんだから安心だろ。
840デフォルトの名無しさん:04/09/11 16:52:35
リトルエンディアンにとって、ビッグエンディアンは
何がビッグ?
841デフォルトの名無しさん:04/09/11 16:54:44
>>840
下位バイトに対して上位バイトだからビッグ
842デフォルトの名無しさん:04/09/11 16:54:47
直径。
843デフォルトの名無しさん:04/09/11 16:54:57
>>840
調べろよ、それくらい。基本だろ
844デフォルトの名無しさん:04/09/11 16:55:14
ENDが
相対的ではないと思う。
845デフォルトの名無しさん:04/09/11 16:55:40
小さなインディアンと大きなインディアン
846デフォルトの名無しさん:04/09/11 16:57:40
>>827
だから宣言はint* n;でしょ。
メモリを確保するのがmalloc使ってる部分でしょ。
メモリを開放するのがfree使ってる部分でしょ。

例えば、
int main( void ) {
int a;
int b;
int* n;
int c;

n = ( int* )malloc( 100000 * sizeof( int ) );

//〜いろんな処理〜

free( n ); //最後に必ず

return 0;
}

みたいにする。
847デフォルトの名無しさん:04/09/11 16:59:46
つまり下位バイト=リトル、上位バイト=ビッグ
なのですね。リトルエンディアンは、小さい桁が下位バイトに
収められるからリトルエンディアン、小さい桁が上位バイトに
収められるからビッグエンディアン、で合ってますか?
848デフォルトの名無しさん:04/09/11 17:01:22
>>847
小さい桁ってのがよくわからんが
リトルエンディアンは下位アドレスに下位バイトが配置され
ビッグエンディアンは下位アドレスに上位バイトが配置される
849デフォルトの名無しさん:04/09/11 17:02:37
850デフォルトの名無しさん:04/09/11 17:03:39
基本情報試験にでも出てくるようなレベルの話はもういいよ
851デフォルトの名無しさん:04/09/11 17:06:37
配置は分かるんですが、エンディアンとう語の語感と、実際の
物理的な配置とが食い違ってるように感じたので、何がどう
リトルで、どうビッグなのかが知りたかったのです。
852デフォルトの名無しさん:04/09/11 17:09:24
例えば1次元配列で
void hogehoge(double a[], int m){
int i;
for(i=0;i<m;i++){
a[i] = i;
}
}
という文法はOKなのに、2次元配列で
void hogehoge2(double a[][], int n, int m){
:
:
}
という書き方すると怒られるのは何故ですか?
853デフォルトの名無しさん:04/09/11 17:11:44
配列の要素数省略できるのは最初だけ
854デフォルトの名無しさん:04/09/11 17:12:02
http://yougo.ascii24.com/gh/00/000012.html
> Endianという呼び方は、
> もともとはガリバー旅行記に出てくる、
> ゆで卵をどちらの端の方から最初に割るか
> という議論に由来している。
結構知られている話と思われ。
855デフォルトの名無しさん:04/09/11 17:15:37
>>853
では要素数が不確定な場合は動的に配列を確保するしかないのでしょうか?
856デフォルトの名無しさん:04/09/11 17:16:32
なるほど、Endian はつまり「から最初に」と考えれば
いいわけですね。
リトルエンディアン=下位バイトから最初に〜
ビッグエンディアン=上位バイトから最初に〜
となるわけですか。ありがとうございます。
857デフォルトの名無しさん:04/09/11 17:18:53
>>855
そりゃ当然でしょうああた
858デフォルトの名無しさん:04/09/11 17:23:08
当然ですか。あー、動的配列は重いからいやだのー。
859デフォルトの名無しさん:04/09/11 17:24:46
>>855
要素数が不確定といっても色々で、配列という選択自体が不適切な場合もよくある。
860デフォルトの名無しさん:04/09/11 17:24:50
動的配列重いのか?初めて聞いたヨ〜ン
861デフォルトの名無しさん:04/09/11 17:24:54
それが嫌ならMB単位で予め確保しとけ
862デフォルトの名無しさん:04/09/11 17:28:17
>>859
数値計算で2次元とか3次元計算してるんですけど、それを可視化する関数に渡す時、
どうしても配列と言う形で渡さねばならんのですよ。

>>860
動的に確保してそれを解放してってのを300msに一度程度やると糞重くなりました。
何かいい方法ありませんか?
863デフォルトの名無しさん:04/09/11 17:29:43
>>862 >>861
スピード気にするなら malloc free 使わず自分で記憶管理
864デフォルトの名無しさん:04/09/11 17:30:04
>>861
スタックには数MBも確保できません
865デフォルトの名無しさん:04/09/11 17:30:17
それほど頻繁に必要なら、あらかじめ大きめに取って置くほうがいいんじゃない?
866デフォルトの名無しさん:04/09/11 17:31:54
なんでスタックが出てくるのだ
867デフォルトの名無しさん:04/09/11 17:35:08
>>864
(方法1)スタックサイズ増やせ
(方法2)staticでヒープ領域に作っとけ
868デフォルトの名無しさん:04/09/11 17:46:05
>糞重くなりました
たくさん出したのね。
869デフォルトの名無しさん:04/09/11 17:47:17
>>828
>別プロセスは関係ない
DOS または Classic Mac OS の話じゃないかと思われます。
870デフォルトの名無しさん:04/09/11 17:47:54
関数のサイズってどうやったらわかりますか?
int test()
{
//55 push ebp
//8B EC mov ebp,esp
return 1;
//B8 01 00 00 00 mov eax,1
}
//5D pop ebp
//C3 ret

こういうのがあったときtestのサイズが10ってのを
命令数を数えなくても知りたいのですが
871デフォルトの名無しさん:04/09/11 17:50:21
>>862
その数値計算とやらの内容を知らないので何とも言いようがないが、
例えば色々なサイズの行列が出てきて、それら個々は計算中にサイズが変わったりしない、
のようなことであれば、
struct gyouretu_type { int gyou, retu; };
struct gyouretu_obj { struct gyouretu_type *type; double *a; }; みたいな構造体で管理すればいいし、
素因数分解のような話であればリストにする手もあるだろ。リストのリストは俺もよく使う。
872デフォルトの名無しさん:04/09/11 17:53:36
リークさせれば診断ダンプするよw
873デフォルトの名無しさん:04/09/11 17:53:57
>>870
君の言う「サイズ」の定義は?
一般にサイズとは領域の開始番地と終了番地の差に1を加えた値で、
領域とは連続した区間のことを言う。
関数が占有する領域は1つという保証がない。
そこで君は「サイズ」に独自の定義を与える必要が出るわけだが・・・
874デフォルトの名無しさん:04/09/11 17:59:49
おまいらすごいな
875デフォルトの名無しさん:04/09/11 18:03:06
>>874
えへん
876デフォルトの名無しさん:04/09/11 18:20:14
>>862
void hogehoge2(double a[], int n, int m)
としてnとmからaの位置を自分で計算すればいい。
877デフォルトの名無しさん:04/09/11 18:24:36
>>862
OS・ライブラリのオーバヘッドが問題になるのなら、
自分で管理すれば?
878デフォルトの名無しさん:04/09/11 20:11:06

( ´゚,_」゚)(((( ´,,_ゝ`))))(´ν_.` )
        
   笑う角には福きたる!
879デフォルトの名無しさん:04/09/11 20:21:54
signal関数について質問です.
サーバプログラムで
signal(SIGCLD,Catch);
として,void Catch(){}に子が死んだときの処理を書いたのですが,
コンパイルエラーが出て,invalid conversion from void(*)() to void(*)(int)となりました.
その後signalのプロトタイプはvoid (*signal(int sig, void (*func)(int)))(int);
ということを知ってvoid Catch()をvoid Catch(int x){}としたのですが,xには
一体何がわたったのでしょうか...これだとコンパイルが正常にできるのですが,
何を渡したのかわからないので不安です.
880デフォルトの名無しさん:04/09/11 20:28:33
そりゃ、引数にした値が渡されるんでしょ。
881デフォルトの名無しさん:04/09/11 20:29:38
>>879
エラーだったらコンパイルできないと思うがなぁ
あと、簡単な英語なんだから辞書片手でもメッセージ読んだほうが
void Catch(int hoge){
882デフォルトの名無しさん:04/09/11 20:30:57
>>881
あ、後半読んでなかった
まあ辞書片手に(ry
883デフォルトの名無しさん:04/09/11 20:37:20
>>880
Catchはfork()された子プロセスが死んだときに呼び出されるわけで,
プログラム中でCatch(hoge);のように呼び出すわけではないのですが
884デフォルトの名無しさん:04/09/11 20:39:51
885755:04/09/11 20:42:07
>>846
ごめんなさい、本当にわからなくて。

例えば、配列の名前を「Array」配列の大きさをNとしてN=100000としたいなら、

int main()
{
int*N;
N=(int*)malloc(100000*sizeof(int));

〜Array[N]を使った処理〜
free(N);
}

ということでいいのでしょうか?
886デフォルトの名無しさん:04/09/11 20:43:57
>>885
オウム返しの返答しないように
試せばわかる事を聞き返さない
887デフォルトの名無しさん:04/09/11 20:46:39
>>885
おしい

int main()
{
int *Array;
Array = (int*)malloc(100000 * sizeof(int));

〜Array[N]を使った処理〜
free(Array);
}
888755:04/09/11 21:16:53
>>887
100000個の配列をちゃんと作っているか確認するために
下のような適当なプログラムを組んでみました。
ところが、i=2506の処理が終わった後、
「行番号 13: '=' の左辺値オペランドが不当」
というエラーが出ました。
どうしたら修正できるのでしょうか?

#include<stdio.h>
#include<stdlib.h>
#define N 100000

int main()
{
int i;
int*Array;
Array=(int*)malloc(N*sizeof(int));

for(i=0;i<N;i++)
{
Array[i]=i;
printf("Array[%d]=%d\n",i,Array[i]);
}

free(Array);
}
889デフォルトの名無しさん:04/09/11 21:23:49
>>888
実はmalloc に失敗していたとか
890デフォルトの名無しさん:04/09/11 21:25:13
>>889
翻訳中に表示された診断メッセージのように見えるが・・・
891デフォルトの名無しさん:04/09/11 21:27:12
>>888
当方の環境では、エラーでないで完走するんだが・・・
892デフォルトの名無しさん:04/09/11 21:29:48
うちも問題無いなあ
Ultra-C Proがヘンなんじゃない?
893デフォルトの名無しさん:04/09/11 21:32:06
>>888
じゃ、これは?

#include<stdio.h>
#include<stdlib.h>
#define N 100000
int Array[N];

int main(void){
   int i;
   for(i = 0; i<N; i++)
   {
      Array[i] = i;
      printf("Array[%d]=%d\n", i, Array[i]);
   }
}
894デフォルトの名無しさん:04/09/11 21:34:22
895デフォルトの名無しさん:04/09/11 21:35:33
Ultra-C Proって勉強用のインタプリタだったんだね
896755:04/09/11 21:44:28
>>891
>>892
ソフトは何を使っていますか?

>>893
それだと、
行番号 4: 配列のサイズが不当
行番号 10: 'Array' が未定義
というエラーがでました。
897891:04/09/11 21:47:07
>>896
VC2003
なんかウルトラマンの限界かなぁ・・・?
898デフォルトの名無しさん:04/09/11 21:49:05
>>896
そんな変なインタプリタじゃなくて、普通のコンパイラを使うことをお勧めする。
899デフォルトの名無しさん:04/09/11 21:49:19
>>896
Borland C++
>行番号 4: 配列のサイズが不当
てことはSuper-C Proでも使うしかないね
900デフォルトの名無しさん:04/09/11 21:52:09
>>896
> 行番号 4: 配列のサイズが不当
> 行番号 10: 'Array' が未定義

それは想像できるエラーだね。
だって100000は大きすぎるもん

891 892では無いけど、処理系はGCCかVC++だよ。前者はPC-UNIX系(Linuxなど)、
後者はWindows、でデファクトスタンダードですよ。
901デフォルトの名無しさん:04/09/11 21:52:49
Intel C++ Compilerおすすめ
902デフォルトの名無しさん:04/09/11 22:16:56
>>900
処理系にもよるが、400KBは「たかが」だったり・・・
903755:04/09/11 22:30:14
皆さんたくさんのご意見有難うございます。

>>900
「int *Array;
Array = (int*)malloc(100000 * sizeof(int));
free(Array);

をっていないから、Ultra-Cでは配列が大きすぎるという事になってしまうのですね。

今更なんですけど、作ることのできる配列のサイズってコンパイラの種類とかで
違うんですか?
VisualC++6.0(ここで言っているVCでしょうか)だとうまくいったりするのですか?
904デフォルトの名無しさん:04/09/11 22:33:15
windows+cygwin+gcc強いぞ
905デフォルトの名無しさん:04/09/11 22:35:43
>>903
をっていないから?いみふめ
質問に答えると、そうです。
906デフォルトの名無しさん:04/09/11 22:36:22
普通のコンパイラだったらスタック領域のサイズは指定できるよ
907デフォルトの名無しさん:04/09/11 22:38:12
相手がCインタプリタだしなぁ
908デフォルトの名無しさん:04/09/11 22:40:53
>>893の場合はスタック領域じゃないし…。
909755:04/09/11 22:47:43
>>905
「をっていないから」→「を使っていないから」でした・・・。
910デフォルトの名無しさん:04/09/12 01:12:24
メモリ確保なんだから環境依存(含むコンパイラ)が教科書的回答

実際は400Kぐらいならwinのまともな「コンパイラ」ならなんでもいける
だろ
911デフォルトの名無しさん:04/09/12 01:15:04
スモールモデルなんて言葉もあったものだ
912デフォルトの名無しさん:04/09/12 01:16:25
物理メモリの利用可能領域が24MBていふぉしか
913デフォルトの名無しさん:04/09/12 02:07:24
コンピュータ演習か。
914デフォルトの名無しさん:04/09/12 14:29:51
915デフォルトの名無しさん:04/09/12 15:11:37
C言語のprintf関数ののソースとか見てみたいのですが
どこかにないでしょうか?
916デフォルトの名無しさん:04/09/12 15:12:54
>>915
あるよ、うちのLinuxには。
917デフォルトの名無しさん:04/09/12 15:20:57
>>916
マジッスか
どっかにUPしてもらえませんか
918デフォルトの名無しさん:04/09/12 15:29:13
UPもなにも…フリーだし…
919デフォルトの名無しさん:04/09/12 15:31:01
せこせこするな。UPしてやれよw
920デフォルトの名無しさん:04/09/12 15:31:47
>>918
たった一つの関数のソース見るためだけに
わざわざOS落としてきたりはキツイっす
921デフォルトの名無しさん:04/09/12 15:34:18
>>920
あっそう。
922デフォルトの名無しさん:04/09/12 15:37:07
>>920
で、お次は
「たった一つの関数を理解するために
何千行ものコードを読むのはキツイっす」
か?
923デフォルトの名無しさん:04/09/12 15:44:02
>>922
それはないっす
924デフォルトの名無しさん:04/09/12 15:46:30
925デフォルトの名無しさん:04/09/12 16:11:32
>>924
かなり参考になります
どうもっす
926デフォルトの名無しさん:04/09/12 16:14:43
VCとかBCBとかにはちゃんと付いてきているはずなんだがな。
927デフォルトの名無しさん:04/09/13 22:15:13
>>926
あっそう。
928デフォルトの名無しさん:04/09/14 00:13:59
文字列⇒整数変換をしたいのですが、
標準関数の atoi() を使うと 0 がエラー扱いになってしまいます。
この制限を解決するスマートな方法はないでしょうか?
929デフォルトの名無しさん:04/09/14 00:20:38
strtol使うとか。
930デフォルトの名無しさん:04/09/14 00:21:05
>>928
if(sscanf(mojiretsu, "%d", &seisuu) != 1) goto hell;
931デフォルトの名無しさん:04/09/14 00:23:14
sscanfよりstrtolのほうがいいよな。
932デフォルトの名無しさん:04/09/14 00:24:14
評価基準を示さずに結論だけ言うDQNは放置
933デフォルトの名無しさん:04/09/14 00:30:40
930にはなぜsscanfを使うか理由が書いてないな。
934デフォルトの名無しさん:04/09/14 00:35:55
>>929
strtol() もエラー値が 0 なのでだめそうです。

>>930
sscanf() なら 0 が入力されてもエラー値と混同しないですね。
ありがとうございます。
935デフォルトの名無しさん:04/09/14 00:37:25
どうやら質問者の方が頭よさそうだなw
936デフォルトの名無しさん:04/09/14 00:43:02
>>934
もう少し身長にマニュアルを読んだほうがいいよ。
937デフォルトの名無しさん:04/09/14 00:45:02
935の頭は質問者と同レベル。
938デフォルトの名無しさん:04/09/14 00:45:15
>>934
はぁ…
939デフォルトの名無しさん:04/09/14 00:46:07
>>934
エラーかどうかを戻り値で判断すると思い込むのは危険だな。
940デフォルトの名無しさん:04/09/14 00:46:55
標準出力とファイル出力を選択できる機能はどうやれば出来ますか?
941デフォルトの名無しさん:04/09/14 00:47:26
>標準関数の atoi() を使うと 0 がエラー扱い
もうちょっとちゃんと言え。
>strtol() もエラー値が 0 なのでだめそうです。
もうちょっとちゃんと読め。
942デフォルトの名無しさん:04/09/14 00:47:41
>>939
オレも初めて数ヶ月は戻り値が全てと思ってたよ・・・
943デフォルトの名無しさん:04/09/14 00:48:40
>>940
どうやって選択するの?
944デフォルトの名無しさん:04/09/14 00:49:07
>>940
fprintfやfputsなどの引数を変えればいいのでは?
945デフォルトの名無しさん:04/09/14 00:49:13
dup()dup2()
946デフォルトの名無しさん:04/09/14 00:49:32
pipe()
947デフォルトの名無しさん:04/09/14 00:51:20
>>943
そこで悩んでます。if文とかでも出来そうかなとは思うんですがイマイチわからなくて
948デフォルトの名無しさん:04/09/14 00:52:13
write(1, ...);
write(2, ...);
でいいんじゃねw
949デフォルトの名無しさん:04/09/14 00:52:37
>>947
コマンドライン引数でファイル名が指定されていればファイルに、指定されていなければ標準出力に書き出すとか。
argc,argv(main関数の引数)の使い方はわかる?
950デフォルトの名無しさん:04/09/14 00:54:35
>>949
すいませんわかりません…
951デフォルトの名無しさん:04/09/14 00:54:42
if(/*標準出力なら*/)
  fp = stdout;
else
  fp = fopen("hoge.txt", "w");

fprintf(fp, "Hello");
952デフォルトの名無しさん:04/09/14 00:58:48
>>950
#include <stdio.h>
int main(int argc,char *argv[])
{
FILE *fp;
if(argc<=1)
fp=stdout;
else
fp=fopen(argv[1],"w");
if(fp==NULL)
return 1;
fprintf(fp,"はろーわーるど\n");
if(argc>1)
fclose(fp);
return 0;
}

コンパイルしてできた実行ファイルがtestonなら、
testonで標準出力に、teston file.txtならfile.txtに書き出す。
953デフォルトの名無しさん:04/09/14 00:59:33
>>951
あ、出来そうですね。ありがとうございます
954デフォルトの名無しさん:04/09/14 01:00:54
>>952
神様ありがとう!感謝します。
955デフォルトの名無しさん:04/09/14 01:01:47
>>941
よく読んでみました。
strtol() の返り値が 0 の場合、第2引数が数値かどうかを判断すればいいわけですね。

long value = strtol(numStr, &endptr, 10);
if (value == 0 && (*endptr != '\0')) goto ERROR;

こんな感じでしょうか・・・。
956デフォルトの名無しさん:04/09/14 01:04:36
>>955
数字列のあとの空白("-387 "←こういうの)を許さないならそれでいい。
957956:04/09/14 01:05:27
例がまずかったな
"0 "
958デフォルトの名無しさん:04/09/14 01:11:34
>>957
アドバイスありがとうございます。
stdinから入力されたCSV形式の数値解析をしたかったんですが、
sscanf(), strtol() どちらでも実現できそうですので、
もう少し考えてみてよりシンプルな処理になる方を使ってみます。
959デフォルトの名無しさん:04/09/14 01:39:02
>>958
まだ、いまいち分かってないっぽいな。
どうでもいいけど。
960デフォルトの名無しさん:04/09/14 03:01:39
現在あるデータをC言語を使って処理するプログラムを作り、
それがほぼ終わりました。この課題を通してやっと初級の入り口に
立てて、プログラミングの面白さが分かった気がします。
本業ではないですが、プログラミングを続けてレベルアップしたいと
思っています。しかし、次のデータとか、特に課題が見つかりません。

何か面白い課題はないのでしょうか。
恐らくこのままではプログラマーでもない私は今やっているような
面白い課題に自然に巡り合うことは今後もうないと思います。

面白いデータや課題があれば、教えてください。
よろしくお願いします。
961デフォルトの名無しさん:04/09/14 03:14:16
オレが学生のころは、ゲーム作ったり、テキストエディタを作ったり、
お絵かきツールを作ったり、言語のインタプリタを作ったり、いろいろしてた。

作るといっても、書籍のソースを打ち込んで、改造したりってのがほとんどだったけど。
962デフォルトの名無しさん:04/09/14 03:28:09
>>961
どうもありがとうございます。
ツールという課題がありますね(思いつきもしませんでした・・
自分が使いたいと思うツールを作って使うのは面白そう。

963デフォルトの名無しさん:04/09/14 03:39:50
>>962
このスレでも宿題スレでもいいからテンプレリンク含め目を通せばいいよ
964ビル・ジョブス:04/09/14 04:41:03
>962
次はWin32APIを勉強するとかデバイス制御を勉強するのがお奨めです。
コンピュータ言語なんて単なる表現ツールですよ。
(C言語は他の言語に比べてかなり洗練されてるから止められないけど)
965デフォルトの名無しさん
>>939
つーか「エラー値」と聞いて何かを早合点している時点でアウツ