C言語なら私に聞け! Part 65

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

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

コンパイラを探しているなら >>2-13 を。
C machineはCに非ず
上記を逸した場合の結果は激しく未定義だYO!

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

C言語なら俺様に聞け! Part 64
http://pc2.2ch.net/test/read.cgi/tech/1061779941/
2

    ( ⌒)    ∩_ _
   /,. ノ     i .,,E)
  ./ /"     / /"
  ./ ∧∧  / ノ'
 / /,,゚Д゚ )/ /
(       /  ポイントゲット!!
 ヽ     |
  \    \

ログインするたびに(約3分おきに)3ポイント〜1万ポイント獲得することができます。
http://wwa.irias.co.jp/?WCI=Home&WCE=260308
5デフォルトの名無しさん:03/09/22 21:54
>>953
環境はBorland C++ ver.2.31です。
C machine ってこれ? 何で C に非ずなの?

ttp://homepage1.nifty.com/kentake/
>>6
ANSI Cに準拠してないから
8名無しさん:03/09/22 22:16
次のプログラムで、なぜ警告メッセージがでるのか、
どうすれば回避できるのか教えてください。

#include <stdio.h>
#include <time.h>

int main(void)
{
  struct tm *tm_ptr, timestruct;
  time_t the_time;
  char  buf[256];
  char  *result;

  (void) time(&the_time);
  tm_ptr = localtime(&the_time);
  strftime(buf, 256, "%A %d %B, %I:%S %p", tm_ptr);
  strcpy(buf, "Sun 21 Sep 2003, 10:32 will do fine");
  tm_ptr = &timestruct;

  /*
   * 次の部分で警告メッセージ
   */
  result = strptime(buf, "%a %d %b %Y, %R", tm_ptr);
  /*
   * 警告: 代入により、キャストなしで整数からポインタを作りました
   */

  return 0;
}
time.h のインクルードの前に
#define _XOPEN_SOURCE
が必要なのかも

strptime がプロトタイプ無しで int を返すと見なされてるんじゃない?
64がまだ残ってるぞ。
11デフォルトの名無しさん:03/09/23 03:31
【コンパイラ】
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/

【ライセンスや機能などに問題あり】
Microsot 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
12デフォルトの名無しさん:03/09/23 04:23
C言語でゲームを作りたいと思ってます。
現在のスキルとしては、テキストファイルを読み込んで加工してテキストやDOSに出力することはできます。

でもゲーム画面やらなにやらを作るとなると、何をどうすればいいのか サーーーッパリわかりません。
Cの本を漁ってみましたが変数やら文字列やらの話ばかりで、画面を作ったりグラフィックを表示させたりする
話は見当たりませんでした。
とりあえず黒い画面を表示する方法だけでも知りたいのですが、Cで可能ですか?
APIを学ぶ力があるなら可能。
>>12
C でも可能だが、多言語にうつった方がよい。
1512:03/09/23 08:24
誰か答えてください。
>>12
標準Cはデータ処理とか地味な作業を行う関数しかなく、
単独でグラフィカルなプログラムは作れない。
ただ、オセロとかノベルRPGとかなら、標準Cでも十分制作可能。
グラフィカルにしたいなら、標準C+環境依存APIを使い、それを行う。

WindowsならここのSDK第一部がよさげ。
http://www.kumei.ne.jp/c_lang/
1712:03/09/23 12:22
>>13-14 >>16

どもありがとうございます。
実は囲碁ゲームを作りたいと考えており、有名な囲碁ゲームを作っている人はCで作っていると聞いたので
質問しました。
教えてくださったAPIについて調べてみます。

ちなみに>>15の失礼な発言は僕ではないです。
18デフォルトの名無しさん:03/09/23 13:22
>>17
囲碁はめちゃくちゃ難しいと思うよ
(画面表示系とは別な所が)

とりあえず何かの画面表示系を覚えてみては?
19デフォルトの名無しさん:03/09/23 13:33
ME使ってるんですけど、MEで使える一番新しいバージョンの開発ソフト教えてください。
MicrosoftとBorlandってどっちが評価高いですか?
20デフォルトの名無しさん:03/09/23 13:41
>>18
まあ、囲碁に限ったことではないが。
AIとか・・・
21デフォルトの名無しさん:03/09/23 13:42
>>20
人間vs人間にすればいらん
だいたいその囲碁prgを書いた人間にしたって、
コンピュータの思考部分をC言語を用いて実装しただけじゃないのか?
表示部分とかは別の言語を使用したとか。

だいたいそのC言語だってピュアCかどうかも定かじゃないし。
麻雀とかは難しいよな役の判定が
その割には麻雀ゲームをよく見るが
どこかにソースが公開されてるの?
> 麻雀とかは難しいよな役の判定が
なんでやねん(w
清一色との複合役とか相当大変だと思うが…
あとテンパイの判定とフリテンの判定
2612:03/09/23 13:55
>>18
最近、HSPという言語を知り調べてみたところ、ある程度手軽に画面作成ができることを知りました。

しかし、「HSPプログラミング入門」という本の中に、
*******************************************************
JAVAも、HSPと同じく中間言語を用いたインタプリタで、フリー使うことができる言語です。
HSPと比べるとJAVAの方が機能も高く、拡張性にも優れています。もし、JAVAがどの
マシンでも同じように動作し、手軽に扱うことができれば、HSPは必要無いかもしれません。
しかし、現時点ではJAVAは作成したソフト(アプレット)を動作させるにはインタプリタの
ランタイムをインストールしなければならなかったり、互換性に難があったりと手軽に使ったり
配布したりできるまでには、まだ先といった感じです。
*******************************************************
という記述がありました。

これが本当ならば、これはもうぜひJAVAを使いたいところですが、JAVAのどの本を見ても
これまたCの本と同様に変数やら文字列やら配列やらクラスやらの話があるだけで、
画面作成に関する話がありませんでした。

やっぱドシロウトはHSPでシコシコやるしかないんでしょうかね。

>>22
なるほど・・
>>26
Swing の書籍を読め,といいたいところだが…
今熱いのはSWTなんだろうな
28ユン:03/09/23 14:06
VC++でのremoveとrenameの使い方を教えてください。
何度も試してるんですが出来ません。
文法はサイトなどでしらべてあってるはずです。
なにか使えない理由とかあるんでしょうか?
>>28
|_=) マルチの上にスレ違いハケーン・・・
30デフォルトの名無しさん:03/09/23 14:51
マルチはけしからんが、スレ違いではないのでは?
>>30
>>1に注目汁
>>29はremoveとrenameが標準関数でないと思っているのか、それともライブラリやヘッダーファイルを使えるようにする方法を聞いているからスレ違いだと思っているのか。どちらだろう。
VC++なら後者はないと思うけど・・・
>>32
> VC++での〜
と言っている時点で環境依存だろうな

> 文法はサイトなどでしらべてあってるはずです。
とか言ってるしな
test
>>28
>VC++でのremoveとrenameの使い方を教えてください。
リファレンスマニュアル、もしくはヘルプ読め。VC++は知らんが、他と同じだろう。

>何度も試してるんですが出来ません。
そんなこと言われても困る。

>文法はサイトなどでしらべてあってるはずです。
よかったね。それが正しいかどうかを俺たちが知るすべもない。

>なにか使えない理由とかあるんでしょうか?
ない。おまえの個人的な環境までは責任持てんがな。

権限がないファイルか使用中のファイルを操作しようとでもしているのだろう。
Cと関係ない話だということに気づくべきだ。
>35
俺Linuxで暗号化ソフト(つっても任意の数とXOR取るだけ)作って,
そっからWinのGUIに移植したのね.

そしたらLinuxで動作確認したはずなのになぜかファイルが途中で途切れるの.
M$のせいにしてみたり,GUI化の際にいらんことやったのかなって,
職業プログラマと一緒に一時間ぐらい悩んだ.

オチはあえて書かないけど,そんなことを思い出した.
>>36
"b"だね。つまらん。
38デフォルトの名無しさん:03/09/23 18:37
そういや俺もいつもbつけてねーな。
やっぱりつける習慣つけといた方がいいのか。
>>38
俺はむしろ、つけなかったことが無い
漏れもない。
テキストモードでファイル開く理由なんか全くないし。
つけなくてもバイナリで開くからつけない
二乗ってどうやってやるんですか?
a*aで今はやってますが100乗とかに対応できないので
教えて下さい
演算子はない
pow()で計算
即レスありがとうございます
早速やってみます
45デフォルトの名無しさん:03/09/23 21:39
int 1ch = a * a;
int 2ch = 1ch * 1ch;
int 3ch = 2ch * 2ch;

3ch * 3ch == a * a * a * a * a * a * a * a * a * a * a * a * a * a * a * a *

   ごめんなさい冗談です
46デフォルトの名無しさん:03/09/23 22:11
次のソースはコンパイルは通るんですが
実行するとエラーになってしまうんです。
なぜだか教えていただきたいのですが
よろしいでしょうか?

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

main()
{
FILE *ifp;
FILE *sfp;
FILE *ofp;
ifname[21];
sfname[21];
ofname[21];
moji1[81];
moji2[81];
int in;
int count=0;

printf("入力方法選択しる!\n");
printf("1:標準入力 2:ファイル入力");
scanf("%d",&in);

if(in==1)
{
printf("入力したい文字を入れる!\n");
scanf("%s",moji1);
}
4746:03/09/23 22:12
else
{
if(in==2)
{
printf("入力ファイル名を入力しる!\n");
scanf("%s",ifname);

if((ifp=fopen(ifname,"r"))==NULL)
{
printf("氏ね\n");
exit(EXIT_FAILURE);
}
fscanf(ifp,"%s",moji1);
}
}
printf("検索ファイル名を入力しる\n");
scanf("%s",sfname);
if((sfp=fopen(sfname,"r"))==NULL)
{
printf("氏ね");
exit(EXIT_FAILURE);
}
>>46
よろしくありません。
どんなエラーが出るくらい書けよと。
4946:03/09/23 22:12
while(fscanf(sfp,"%s",moji2)!=EOF)
{
if(strcmp(moji1,moji2)==0)
{
count++;
}
}
printf("出力ファイル名を入力しる!\n");
scanf("%s",ofname);

if((ofp=fopen(ofname,"w"))==NULL)
{
printf("氏ね\n");
exit(EXIT_FAILURE);
}

fprintf(ofp,"%sは%d件あったぞゴルァ!\n",moji1,count);
fclose(ifp);
fclose(sfp);
fclose(ofp);
}


5046:03/09/23 22:14
>>48
すいません。
あの、標準入力をして、出力をすると
プログラムが止まってしまうんです。
どうしたものでしょうか?
>>50
#includ<stdio.h>

#include<stdio.h>
に。fcloseは開けたものだけCLOSEに。
charにしてないのはわざと?
あと、scanfを使うならわかってて使ってるならいいが
ttp://www.catnet.ne.jp/kouno/c_faq/c12.html
などは目を通しておきましょう。
5346:03/09/23 22:49
ご指摘ありがとうございます。
charはこっちに移す時に消えちゃったみたいなんですいません。
scanfは、そのページ見ておきます。リンクありがとうございます。
>>45
今更だが、識別子の先頭に数字は使えないぞ
これについて、謎なんですが・・・
普通にprintf関数を使って、式を入れたら
結果が小数点が出ません。
1/2 にしたら 0.5と出ません。
0と出ます。どうしてなんでしょうか?
計算がintで実行されてる、またはintで表示してる
>>55
%dで浮動小数点を表示しようとしてる
浮動小数点は%f
当然代入も
>>55
1.0/2.0
ていうか、そんな質問は最小限コードでもいいから貼れよ。
>>55
(double)1 / (double)2
>>55
すでにレスがいくつもついているけど、
float x;
x = 1/2;

って書くと、コンパイラは、まず整数値の1を整数値の2で割って、
その結果として得られる整数値のゼロを浮動小数点値のゼロに変換して、
変数xに代入するぞ。
ちょっと気になったんで質問です。

return func(), 0;

というコードを見たんですが、これだと戻り値は 0 になるようですが
これにはなんの意味があるのでしょうか。
単純に return する前に関数を実行したいだけでしょうか?
ひとつの「式」にする必要がある時にカンマ演算子が使われる場合がある。
if (式) とか while (式) とか xx ? 式1 : 式2 とか。

return の場合でも{}で囲むのがちょっといやな場合に
if (xx)
 return xxx, yyy;
などとする場合もある。

ただ、この場合は行数節約だけかもしれないけど。
カンマ演算子の意味じゃなく、ここで使われている意味じゃないか?
俺には全く思いつかないな。
#defineマクロじゃないよね?
6562:03/09/25 18:54
>63
ご解答ありがとうございます。カンマ演算子の理解が曖昧なので勉強になりました。

>64
マクロではありませんでした。いくつかそう言う個所があったのですが、
どうもただの行数節約っぽいです。
>>65
カンマ演算子は最後に評価した値を返す
ソースコードの中に SJIS や Unicode を混ぜるとコンパイルエラーになりますが、
マルチバイト文字をコードに埋め込みたい場合は普通どうするのですか?
gettext 等を使うのが一般的なのでしょうか? なるべく環境依存しない (Win 除く)
方法を教えて下さい。
68デフォルトの名無しさん:03/09/25 23:58
文字列検索で、ワイルドカード検索機能をつけたいと思っています。
どういうコードを書いたらうまくできるのでしょうか?
?ならできるんですけど*がうまくいきません。
69デフォルトの名無しさん:03/09/26 00:07
>>67
エスケープシーケンス?
ccでコンパイルしてるなら -Y 付ける
>>68
俺には分かる
お前は授業で簡単なシェルを実装しようとしている
71教授:03/09/26 00:18
>>68
おまえの事は何でも知っている。いつでも私は
おまえを監視している。
72デフォルトの名無しさん:03/09/26 00:45
struct x {};
int main()
{
 struct x a = {};
 struct x b = a;
 return 0;
}

bの初期化でエラー(初期化子が定数じゃない)になるのですが、
使ってるコンパイラが悪いのでしょうか?
>>72
仕様だと思う。
定数以外での初期化はできない。
a は定数じゃないし。
>>72
その状況で b = a とする訳を聞きたい
>>72
struct x a = {};
じゃなくて
struct x a = {0};
してみ
76デフォルトの名無しさん:03/09/26 01:14
ところで、X86-64コードを吐くコンパイラは存在するのか。
Linuxでも見たことないし、VisualC++は対応してないし、
Borlandは期待できない。
あったら教えて栗。
>>76
Intelのコンパイラは間違いなく対応している。

これを見ると、gcc 3.2.2 は対応しているってことだろうか
http://www.turbolinux.co.jp/products/misc/tl8a/index.html

Solaris/x86用CCはどうだろう。
7872:03/09/26 02:05
>>73
ttp://www-ccs.ucsd.edu/c/declare.html#Object%20Initializers
↑ここの最後の方の表を見ると、
"structure"の"Dynamic Initializer"に"compatible structure rvalue"が許される
ように書いてあると思うので、仕様ではOKなはずだと思ってます。

>>74
非定数式で構造体を初期化するコードがコンパイルできるかテストするため、だけです。

>>75
初期化子が多すぎるそうです。
79デフォルトの名無しさん:03/09/26 08:08
文字列の数値をintもしくはcharの配列の格納する標準ライブラリ関数あったら教えてください
80デフォルトの名無しさん:03/09/26 08:28
Windowsのユーザーです。

C言語ではエントリポイントはmain関数です。これでプログラムを書いても
きちんとWindowsで作動するのに、なぜ WinMainというエントリポイントが別に
用意されているのですか? それと WinMainはC/C++のどこにも定義されていないのに
なぜ、勝手にこれをエントリポイントとしてコンパイラやOSは認識するのですか?
81デフォルトの名無しさん:03/09/26 08:29
>>72
メンバーが一つもない構造体を作る理由はなに?

>>79
数字列 -> 数値のことならstrtolやatoi、それにsscanfで。
8280:03/09/26 08:30
もう一つ質問があります

C++の大半はC言語の拡張です。いわば機能をパクッています。
著作権の侵害等でかつて訴訟問題は起こっていないのでしょうか?
>>80
ANSI Cのmainとは引数が違うからだろ。
8480:03/09/26 08:32
>>83

なぜ引数を変える必要があるのですが普通のmainでも動くのですが。
>>84
動く動かないの問題じゃないだろ・・・
ところでスレ違い。
8680:03/09/26 08:38
動く動かないの問題じゃないなら何の問題なのだろう・・・・。
引数は誰が使うものか。
>>87
俺様
89デフォルトの名無しさん:03/09/26 12:01
コマンドラインからコンソールプログラムをgccでコンパイルしたら
gcc :installation problem, cannot exec 'cpp0':Invalid argument
と出てコンパイルできません。pathは通したんですが。ほかに何か
必要ですか? bccだったらできるんですが。当方C初心者。
>>89
gcc: installation problem と書いてるだろ
正しくインストールし直せ
正しいインストール方法は自分で調べろ
9172:03/09/26 12:19
>>81
非定数式で構造体を初期化するコードがコンパイルできるかテストするため、だけです。
すんません。
92デフォルトの名無しさん:03/09/26 12:29
>>90
何回かインストールしなおしたんですが・・・・
>>91
ちゃんとメンバー書け。テストにもならんだろ。
初期化っていっても、結局は代入だろ。代入だから問題ないはず。

>>92
グチを書くスレではありません。
>>92
スレ違い。gccスレかmingwスレに行け。
>>72
もう何人か回答してるように、ANSI Cでは空の構造体定義を許していない。
(gccのように拡張仕様としてサポートしているコンパイラはあるが)

初期化式が定数かどうかは無関係。
使ってるコンパイラくらい書くように。
ANSIの規格票もってるか?
>>72
struct x {int a;};
int main()
{
 struct x a = {0};
 struct x b = a;
 return 0;
}
これは通ると思うけど。

>>93
この場合、代入じゃなくて初期化だと思う。
98デフォルトの名無しさん:03/09/27 00:47
例えば、01とか007とかのように先頭にゼロのつく数字を表示したいのですが、
↓のようにするとゼロがきえてしまいます。どうすればいいのでしょうか?

#include <stdio.h>

main()
{
int number;

for (number = 01; number <= 50; number++)
printf("%d\n", number);

return 0;
%02d
100デフォルトの名無しさん:03/09/27 00:52
>>99
うお!早速レスが(・∀・)
できました!ありがとうございました!!
101デフォルトの名無しさん:03/09/27 01:21
引数 A,Bを渡し、AにA/Bを、BにA/Bの余りを返す関数を
組んだのですが、なぜかこの関数だけコンパイルできません。

int devide(int *a, int *b) {
int c,d;
if( *b == 0 )return -1; /* 0除算エラー */
c=*a/*b;
d=*a-(c**b);
*a=c;
*b=d;
return 0;
}

3日かけてこの関数がコンパイルできないところまでは
突き止めたのですが、もう力尽きました・・・
だれかたすけてください・・・
>>101
もうすこし、カッコよく書きましょう。
予約語やコメントが色分けできるエディタって便利だよね
104デフォルトの名無しさん:03/09/27 01:30
printfで表示した画面の文字をすべて"a.txt"に保存したいときって
どんなコード書けばいいんですか??
>>104
hoge.exe > a.txt
106デフォルトの名無しさん:03/09/27 01:34
コマンドでできますね。失礼しました。
>>101
c = *a / *b;
d = *a - (c * *b);
>>104
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/fopen.3.html
のfreopenトカ。試したこと無いが。
void f(){
  a();
  b();
  c();
}
という関数を仕様変更で、冒頭でxという関数を評価して微妙に処理に差をつけたいとき、安直な人は
void f(){
  if( x() ){
    a1();
    b1();
    c1();
  } else {
    a2();
    b2()
    c2()
  }
}
としてしまうそうで、ダラダラと長い関数になってしまう原因なのだそうです。Cマガジンによれば。
こういうときはどういう風にするのが適切なのですか?
知らね。
void f() {
 if (x()) {
  f_sub1();
 } else {
  f_sub2();
 }
}
とでもしろってんじゃねーの?
後からの仕様変更を許すな、という事だ。
113デフォルトの名無しさん:03/09/27 03:09
1) f()に追加するのをやめる
void f1() { a1(); b1(); c1(); }
void f2() { a2(); b2(); c2(); }

if( x() ){
f1();
}else{
f2();
}

2) C++にして多態で解決

3) 設計を見直す
>>101
× devide
○ divide
d = *a % *b;
11672:03/09/27 08:02
>>93,95,97
使ってるコンパイラでは通らなかったので、gccで通るサンプルをつくったのでした。
すいませんでした。

メンバがあっても同じエラー(初期化子が定数じゃない)になります。
どうもコンパイラが悪いようですね。
コンパイラは、とあるマイナーコンパイラの古めのバージョンで、
故あって仕事で使わされてます。
>>101

int divide(int *a, int *b)
{
    int c, d;

    if (*b == 0)
        return -1;

    c = *a / *b;
    d = *a % *b;

    *a = c, *b = d;

    return 0;
}
>>101
すでにレス多数だけど、C言語の仕様では、コンパイラがソースコードを
調べて予約語を見つけ出すとき、「できるだけ長い範囲で一致するもの」
を探そうとするから、/ と * が並んでいると、2つの演算子「*」と「/」ではなく、
ひとつのコメント開始記号「*/」だと判断してしまいます。

空白を間に入れるか、カッコを使うかしてください。

また、掛け算として使う*演算子より、メモリの中味を読み出すための*演算子の
ほうが優先度が高いので、c * (*b) を、c**b と書くのもよくありません。
119118:03/09/27 11:07
>>118
ちょっと訂正。順序が入れ替わってました。

> 2つの演算子「*」と「/」ではなく、 ひとつのコメント開始記号「*/」

2つの演算子「/」と「*」ではなく、 ひとつのコメント開始記号「/*」
120デフォルトの名無しさん:03/09/27 11:07
> コメント開始記号「*/」
(^o^;)
質問、エラーが出ます。

#include <stdlib.h>
/*何もしないプログラム*/
int main(void){return 0;}
122デフォルトの名無しさん:03/09/27 12:10
>>121
でません
出ないじゃん・・・
ワーニングじゃないの?
質問もエラーも出ないですね。
>>118に対して言っているんじゃないの?
/* ←全角だぞって。
>>118
c**b がダメな理由が理解できないのですが。
**b
f**k
>>127
「c**b」と「c * *b」と「c * (*b)」で結果に違いはありますか?
>>129
ありません。>>118のc**bの話は忘れてください。
下手すぎ
そんなんじゃ「坊主」だよ
132sage:03/09/27 23:38
static についての質問です。

 構造体Aの連結リストを考える。動的にリストに要素を追加していくために、
新しい要素を作ってその要素へのポインタを返す関数を作る。
 このとき、要素作成のために呼び出されるcreateA関数は、staticでなければ
ならないでしょうか?
 ご指導よろしくお願いします。m(_ _)m
>>133 ソース
133デフォルトの名無しさん:03/09/27 23:39

/* 構造体A */
struct A{
char string[64];
struct A *next;
}A;

void main(){

A *pA;

/* pAの後ろに要素を追加 */
pA->next = createA( pA );

}

/* リストへ要素(構造体)を追加する関数 */
static A *createA( A ){
A *newA;

newA = malloc( sizeof(A) );

strcpy( newA->string, "aaa" );
newA.next = NULL;

return newA;
}
>>132
>createA関数は、staticでなければならないでしょうか?

意味がわかりません。
というか、あなたが関数をstaticにする意味をわかってないのでしょうね。
>>132 いいえ。
>>134 日本語の勉強をしましょう。
>>135
ヴァカですか?
>>137
いいえ
関数をstaticにする意味を分かってないと思われ
139132:03/09/28 00:28
>>134 >>135
本を参考にしながらコードを書いてるんですが、
なぜstatic指定する必要があるのかわからないのです。。。
140デフォルトの名無しさん:03/09/28 00:28
質問もおかしいが、何よりも >>133のプログラムって、無茶苦茶なんですけど。
もっと基本的な勉強をしたほうがいいでしょう>>132
>>139
その本のstatic関数のとこよみなさい
>>139
じゃあ聞くが、staticにする意味は何?
「必要があるかわからない」のじゃなく、staticがわからないのでは?
C言語の入門の本を買うなりして読んで、staticとは何かを学ぶべし。
>>132
なんて本ですか?すごく興味があります。
>>132
ファイルスコープの問題ということで終了。
145118:03/09/28 02:26
>>120
うん、えらそうに説教しておいてポコポコ間違えているんだから、情けないよねー

廊下に立ってK&Rの本でも朗読しなくっちゃ・・・  逝ってきます。(大恥)
>>145
朗読するんかよ
読むんじゃない、理解するんだ!
頭で理解するんじゃない、感じるんだ!
149デフォルトの名無しさん:03/09/28 09:44
ポインタで質問です。
char* str;
と宣言して
str = "aiueo";
ってありますよね。

これってポインタ変数に文字列を入れてることにならないんですか?
他なら、
int i;
int* pi;
ってちゃんと2つ宣言して、pi = &i;ってしてるのに。
文字列の場合は特別なんですか?
前の例で"aiueo"って文字は宣言してないのにどっかに格納されてるの?
YES
151デフォルトの名無しさん:03/09/28 09:48
>>149
> これってポインタ変数に文字列を入れてることにならないんですか?
ならない

> "aiueo"って文字は宣言してないのに
"aiueo"は定数だから。10や'A'なんかも宣言しないでしょ?

> どっかに格納されてるの?
そう。そしてstr="aiueo";とすると"aiueo"の先頭アドレスがstrにはいる。
>>148
感じるんじゃない、感じさせるんだ!
153デフォルトの名無しさん:03/09/28 11:01
>>151
>そう。そしてstr="aiueo";とすると"aiueo"の先頭アドレスがstrにはいる。
 先頭アドレスが入るって事はやっぱりどっかに格納されてるんじゃないか。
 どこに格納されるの?
>>153
どっか。
一般的にはプログラムの定数置き場。
左から23μm、上から100μmのあたりかな
>>153
> やっぱりどっかに格納されてるんじゃないか。
だから「そう。」と言っているだろ。
質問して答えてもらってるクセに態度のでかい奴だな
機械語(というかコンピュータのアドレッシングの仕組み)を想像できるように
ならないと真の意味でポインタを理解することは難しい。
厳密に理解したければやはりコンピュータの仕組み系の書籍を読むべし。
>>149
リテラル文字列は書き換えてはいけないので、
安全のため、ポインタ変数にconstを付けよう
const char* str = "aiueo";
暗黙のconst外し
161デフォルトの名無しさん:03/09/28 22:20
奇数の魔方陣をつくりたいのですが上手く入力値を
2次元配列に入れる事が出来ません。
奇数の魔方陣の簡単なプログラムソースを載せていただけないでしょうか?
作りたいのか作ってほしいのかどっちだ
>>161
www.google.co.jp
>>161

>>1の4行目くらい嫁
>>164
GUIは使っていませんが、何か?
うん。これは確かに>>164が悪い。
しかし>>165の低脳さもはっきりした。
>>161
#include <stdio.h>
#define N 5
int x=N/2,y=N/2+1,a[N][N],n;main(){for(;n<N*N;a[y][x]&&(--x<0&&(x+=N),++y>=N&&(
y-=N)),a[y][x]=++n,++x>=N&&(x-=N),++y>=N&&(y-=N));for(y=0;y<N;y++,printf("\n"))
for(x=0;x<N;printf("%3d",a[y][x++]));}
いきなり初心者質問で申し訳ないのですが失礼します。
EOFの値を出力するプログラムを作ったのですが(K&Rの演習1-7です…)
コンパイルが通りませんのです…以下、問題のプログラムです。
#include<stdio.h>

main()
{
printf("EOFの値:%d\n",EOF);
}
間違えようの無いプログラムのはずなので逆にどこをどうしていいか
分からなくなってしまいました…
環境はコンパイラが「lcc-win32の試食版」で、osはwindowsxpです…
あぁ…どうしたら…
どこがおかしいかわからないなら(俺もわからん)
せめてどんなエラーが出たかくらい書けや。

あり得るのは
include pathが設定されてないとか
本当にEOFが定義されてないとか

もう一度書いとく。
今後も含め、うまくいかなくて質問するなら
どんなエラーメッセージだったかを必ず書け。
>>166
空白行は一行にいれなかったんだと思う。
>>169
即レスありがとうございます/身勝手な書き込み方本当に失礼しました。
以後気をつけたいと思います。

エラーなのですが、コンパイルしようと
「lcc ファイル名」と入力してもその後に空白が数行(大抵4行)でてきて
再びコンパイラのあるディレクトリが表示されてしまうのです。(エラーメッセージの類は
でてきませんでした)
今日学校のPCでも試してみようと思います。
お手をかけて本当に申し訳ないです…
lcc-win32の事は知らないからって思ってたけど、
もしかしてLSI-C86試食版じゃないのか?
だったらlccとだけ入れればオプション一覧等が表示されるはず。
何も出なければexeが壊れてるし
ちゃんと表示されるようなら設定ファイル(_lccだったかな)がおかしいかも。

と思ったんだけど・・・
2KやXPで16bitプログラムを最初に実行するときは
マイクロソフトかな漢字変換なんちゃらが組み込まれましたって出る。
これがなんかいたずらしてるっぽい。

今やってみたら初回はそのメッセージが出て、
そのままプロンプトを閉じなければlccのメッセージも出た。
が、もう一度コマンドプロンプトを開いて実行しようとしても
空白が10行くらい表示されるだけだった。
で、そのままlccコマンドを何回入力しても何も表示されない。
空白の行数が少なくなっていくだけ。

理由は知らない。

とりあえずLSICやめてbcc辺りを使ってみたら。
http://www.borland.co.jp/cppbuilder/freecompiler/
しかし、今この時代にK&Rはどうなのよ。
基礎、基本として抑えておくのは良いことだけど、
妙な癖がついたり、今でもそれが世の中で通じると思われるとやっかいだな。
>>173
s/K&R/C/
175デフォルトの名無しさん:03/09/29 15:43
英文に出て来る単語をカウントしてリスト構造のテーブルを作って単語が新しい単語が出て来るたびにmallocで領域割り当て登録して最後に出て来た単語とその数を吐き出すプログラムを作ってました
今度はそれをアルファベット順、もしくは頻度順に並べ替えようと思ってます
クイックソートを用いたいと思ってますが
先頭からと最後尾からスキャンする際にどーやろーかなと思ってます
0x804c5f0 23 hunter
0x804c610 1 strcmp
0x804c630 3 return
0x804c650 1 strcpy
0x804c670 1 p
0x804c690 1 s
試しにアドレスを以上のように吐いてみましたが見た所0x20刻に配置されてるようなので0x20ずつずらしてスキャンしようかなと思ってます汎用的では無いですが
それ依然にmallocで割り当てられた領域が上のように一定の間隔で配置される保証はありませんよね?
176175:03/09/29 15:44
と思うのですが
どうやって一こ前のリストを参照すればいいのでしょうか

>>175
なんだかよくわからないけど、それぞれの文字列の先頭アドレスを配列にいれてqsortに渡せばよいのでは。
リストにしているなら最後に再構築。
178デフォルトの名無しさん:03/09/29 15:57
あ、一個前のリストへのポインタ変数を入れとけば問題ねーのか
メンドクセ
179デフォルトの名無しさん:03/09/29 16:01
既存のファイルを連番で20個コピーしたいんですがどうすればいいですか?
たぶん手でコピーしたほうがはやい
181デフォルトの名無しさん:03/09/29 16:29
>>179
cat * > unko
>>178
双方向リストの操作は結構バグを出すのでお勧めしない
それはあなただけです。
>>176
再帰をつかえ。
>>175
次または前の要素の参照方法がわからんのか?
本当にリストになっているのか?
>>183
そうか?
双方向リストや二分探索はバグの出やすいデータ構造・アルゴリズムの代名詞だと思うが
それはあなただけです。
>>187
( ´_ゝ`)
189デフォルトの名無しさん:03/09/29 18:47
二分探索がバグの出やすいアルゴリズム!?
二分木探索の間違い?
>>189
本気で言ってるの?
>>190
本気だが。
二分探索って整列済みの配列から探すやつだろ?あれはかなり単純なアルゴリズムだろ。
>>189
bsearch が C の標準関数になっている理由が分からないの?

qsort は実用的な速度を出すためには知識も行数も必要だ
対して bsearch は知識も行数も要らない
それなのに bsearch が標準関数に入っているのは何故か?
行数も知識もバグの危険も無いstrlenが標準関数に入ってるのは何故だよ。
>>192
なぜって探索はよく行われるからだろ。
よく使われるから標準関数になっている。

バグが出やすいから標準関数になっているって??
じゃあ文字列の長さを調べたりすることもバグが出やすいというのか?
195171:03/09/29 19:02
横レスになりそうで申し訳ないんですが…

>>172さん
何から何まで本当にありがとうございます。
学校ので試したところ数回空白がでたあとにはちゃんと通りました。
家のはlccでオプション一覧がでるのでexeファイルがいかれたってことは
ないかもしれません。このままではどうにも…なので、紹介してくださった
コンパイラを使用してみようと思います。頼りっきりで本当にすいません…

>>173さん
一度は読んでみたいと思ってました(^^;
一通りの基礎の基礎をやったので演習くらいいけるかなと思ったんですが…
すいません、やっぱりまだ初心者にも成れてないです…

…K&Rはもう読む価値もないのでしょうか…
俺は、価値がないと思った。
>>195
第二版ならいいと思うけど。初版じゃ価値なし。
198デフォルトの名無しさん:03/09/29 20:08
#includeが使えん。困った。
199デフォルトの名無しさん:03/09/29 20:30
えー、読む価値無いんですか?

「コレは俺のバイブルだ」
「K&Rは俺のプログラミングの師匠!」
「プログラマなら必読!」

とか各地で絶賛されているので
一つ買っておこうと思っていたのだが・・・

>>199
俺もそう思って買った口だが。
何も得るものは無かったよ。
201195:03/09/29 20:42
>>196さん
やはり「C言語やるなら一応目くらい通して桶」レベルなんでしょうか。

>>197さん
しかし二版といってももう第一刷から相当年月たってますしね…
でもヘタな入門書よりは読んでるとおもしろいです。

あぁ…完全にスレ違いでした。すいません、吊ってきます。
それでは失礼しました。
>>199
異様なぐらいの売れ方だったからね。
当時Cのまともな日本語の教科書はKRだけだったから、
(他言語を含めて、超越していた)
ファンは多いし、その2世3世も薦めるから、
いろんな所で絶賛されているんだろう。

しかし、Cの教科書としてはいまだにそうとうの実力を持ってると思うが、
他に250ページぐらいの適当な教科書はあるのだろうか?
日本ではフォトショが絶大な人気なのに他の国ではそうでもないのと同じようなもんかな。
日本は口コミの影響力が強いのかも試練。
204デフォルトの名無しさん:03/09/29 21:49
C言語のprintfで「"」を表示させたいときはどうすればいいのですか?
教えてください。お願いします。
\"
>>203
アンチ必死だなw
207204:03/09/29 21:51
>>205
できましたー!
ありがとうございます。
初版のK&Rは他言語(FORTRANやPascal)を使いこなしている人の
為の、C言語入門書という位置付けだったからね。

初めてのプログラムを学ぶ人にはキツイし、
JAVAやPerlを既に知っている人には得るところは少ないかも知れない。

漏れ的には、歴史的名著という位置付けでも読んでほしいな。

>>203
K&Rが常識を超えて売れたのは日本だけじゃないよ。
>JAVAやPerlを既に知っている人には得るところは少ないかも知れない。

毒されてるなw
というか、C言語に関して名著と呼ばれるものって
何があるだろうか?「初心者向け」とか「初めて学ぶ人の」とかじゃないスレ
って今ちょっと検索かけたけど無いんじゃね?
Cやってんなら、とりあえずコレ嫁みたいなのってどんなのがあるんだろ?
洋書とか全然目向けてなかったから見当つかねぇや…
エキスパートCプログラミング(ASCII)かな。
「プログラミング診断室」とか
第2版も出たし
「Cプログラミング診断室」な
あれは頭が古い人の書いた本だからダーメ
必ず嫁ってほどではないけど、真珠本も名著だよね。

正式書名、思い出せない
「プログラミング・パール」じゃ言語違うし。(それはラクダ本)
>>215
珠玉のプログラミング
Programming Pearls 2nd Edition
奥村先生のC言語による最新アルゴリズム事典は?
218215:03/09/30 00:27
>>216
それだ。さんくす
>>197
初版なんてわざわざ狙わない限りいまさら入手不可能だろうw
K&Rと言われてANSI以前のアレを思い浮かべるのは年寄りだけw

>>195
CをやるならK&Rを読む価値はある。
ただ、今となっては入門用の言語としてCが適切かどうかは考慮の余地がある。
Perl、Ruby、Pythonとかのそれなりに色々できるスクリプト言語か、
JavaやC#なんかからのほうが入りやすいかもしれない。

#CはパワステもABSもカーナビもETCも何もついてない車だが
#何もついてないことが乗り手を育てる、っちうこともあるかもしれんけどね
>>217
最早古すぎ。
221デフォルトの名無しさん:03/09/30 02:49
三つの値の中央値を求める関数を作っていてとりあえず下記のようなものを
思いついたのですがなんとなく効率が悪そうな気がします。
もっと効率の良い書き方はありませんか?

int med3( int a, int b, int c ) {
int min = a, max = a;

if (min > b) min = b; if (min > c) min = c;
if (max < b) max = b; if (max < c) max = c;

return ( ( a + b + c) - min - max );
}
(a>b)?(b>c)?b:(a>c)?c:a:(略
>>221
#include <stdlib.h>

int mid3(int a, int b, int c)
{
    int array[3] = {a, b, c};

    qsort(array, sizeof(array) / sizeof(array[0]), sizeof(int), cmpint);

    return array[1];
}

int cmpint(const void *a, const void *b)
{
    int ret = 0;

    if (*(int *)a < *(int *)b)
        ret = -1;
    else if (*(int *)a == *(int *)b)
        ret = 0;
    else
        ret = 1;

    return ret;
}
           /\
    ∧_∧  /\  |
   (・∀・,,)/   |: |
   / `ー'○ヽ    |: /
   | l/|:::| )〜  j/
   (○  ヽィ    \
  /ヽl\  \     \ ズルズル
       ` - 、r' 〜   \∧∧
                 (⌒>>223)   
                 \  つつ 〜
                   `r‐、つ
>>223
cmpint()に条件判断はいらない。単純に、return *(int*)a-*(int*)b;でいい。
まぁそれ以前に爪を切るのに鎌を持ち出すなってことで。
226デフォルトの名無しさん:03/09/30 10:29
厭味な人。
227デフォルトの名無しさん:03/09/30 10:39
約数をもとめるにはどのようなソースを組めばいいのですか?
また、その内容を説明してください
1、素数を列挙する事
2、素数での除算+余りを求める事

が必要です。 ここまではC言語の問題ではありません。
229デフォルトの名無しさん:03/09/30 11:01
#include <stdlib.h>

int mid3(int a, int b, int c)
{
    int array[3] = {a, b, c};
    int mid;

    qsort(array, sizeof(array) / sizeof(array[0]), sizeof(int), cmpint);

    mid = array[1];

    return mid;
}

int cmpint(const void *a, const void *b)
{
    return *(int *)a - *(int *)b;
}
>>219
>K&Rと言われてANSI以前のアレを思い浮かべるのは年寄りだけw

何言ってんだか(w
この話題の大元になった>>168は、ANSI以前のアレですが何か?
231デフォルトの名無しさん:03/09/30 11:57
>>225
望洋の本にそれはダメだって書いてあったよ。
片方がINT_MAXに近く、もう片方が負の数だとダメだって。
そうだね。 8bit符号付き で 100- (-100) = 200 だけど、200は 負数になってしまうものね。
233デフォルトの名無しさん:03/09/30 13:20
すみません。質問させてください。

コンパイルすると、
Debug Error!
Program: D: .....
DAMAGE: after Normal block (#62) at 0x00441520
というエラーが出てしまうのですが、
原因がわかりません。
メモリの解放のところで問題が起きているようなのですが。。。
よろしくお願いいたします。
234233:03/09/30 13:22
書き忘れましたが、VisualC++です。
よろしくお願いいたします。
233は放置でよろ > ALL
236233:03/09/30 13:26
間違えました。コンパイル・ビルドは問題ないのですが、
実行するとそうなってしまいます。
よろしくお願いいたします。m(--)m
>>233
スレ違い。
VC++関連のスレッドへどうぞ。
そのときは、問題となる辺りのソースも引用するといいかもしれません。
238233:03/09/30 14:03
>237
ありがとうございました。
早速そちらで、質問してみます。
>>232
char は式の中では int に変換されちゃうんだぞ。
それくらい知っとけ。
だから 200と計算は出来るけど 200を代入すると負数になるんだろ
>>230
内容はそうだけど、二版で演習全部書き換えたわけじゃないから
載ってるんじゃね?と思て今本棚見たら載ってますた。

質問内容もかわいいもんだったんでここは普通に「ANSI規格基準」
と考えるのが…
まぁ粘着してもしかたないからもう言わんが。

K&Rの初版は機会があったらみてみると面白いよ。
あのころはvoidなんて(ry
voidなんていらねぇよな。Cでもfjでも。
・・・K&Rと呼ばれている本買っちゃったYO!


244243:03/09/30 20:18
ちなみに今日の話
245デフォルトの名無しさん:03/09/30 23:30
>>243
読んだ感想を教えてくれ。
246デフォルトの名無しさん:03/09/30 23:54
0以上N未満の循環する(0の前がN-1、N-1の次が0になる)符号無し整数値 x を、
符号尽き整数値 n だけ動かした値を求めるとして、
unsigned advance( unsigned x , int n ){ return ( x + n ) % N; }
で問題なく動作するでしょうか?
n が負の時の値が実装依存になってしまうような気がするのです。
247246:03/09/30 23:55
すんません。
s/符号尽き/符号付き/
>n が負の時

これがそもそも間違ってる
符号付きの表現形式をどう仮定している?
limits.hの〜_MINをどう思う?
249246:03/10/01 00:22
> 符号付きの表現形式をどう仮定している?

とくに仮定などしていません。
あの式に、符号付の表現形式に対する仮定が必要なのであれば、
「問題がある」のだとおもっています。

> limits.hの〜_MINをどう思う?

どう思うって、、そんな、急にそんなこと聞かれても、心の準備ってもんが、
えーと、嫌いじゃぁ、ない、かな。
x+nの動作は符号付きか符号なしか
符号なし演算に負数を足すという概念は存在しない
符号付きの値を符号なしで表現できない場合の変換結果は未定義
>>251
プ。負数を足すということは正数を引くということだろ。
>>246
nが負の時って、+nが-nになるのと同じだと思う。
だからそれだけなら問題ない。
ただし、x+nが符号付きで考えて0以下になる場合は、どうなんだろうね?
>負数を足すということは正数を引くということだろ。

コンパイラは心を持たない
>>246
処理系依存。
x + n の結果が負の時に結果が負になる可能性がある。
というか、Intel マシンだとそうなる。

暗黙キャストの向きが int → unsigned だから
x + n ( n < 0 )
の時点で未定義じゃね?
>>256
キャストの向き忘れてた。スマソ。

それだと、x + n の値、未定義にはならないんじゃない?
x + (unsigned int)n の結果は毎回決まってるっしょ。

まあ、(x + n) % N の結果は N が2の冪の場合を除いて正しい結果にならないけど。
258246:03/10/01 01:26
おぉ、いろいろとありがとうございます。
で、やっぱり>>246は問題ありってことで、advance()を修正してみました。

unsigned advance( unsigned x , int n )
{
 n %= (signed)N;/* (-N,N) */
 if( n < 0 ) n = N - n;/* [0,N) */
 return ( x + n ) % N;
}

これなら、いかなるC/C++言語処理系でも正しく動作しますかね?
ただし、前提条件として、
( N <= ( INT_MAX - 2 ) / 2 ) && ( x < N )
を満たすものとします。
259246:03/10/01 01:29
うぁ、また間違えてる。
前提条件は
( 0 < N ) && ( N <= INT_MAX / 2 ) && ( x < N )
を満たすものとします。
>>258
C99 より前の規格では、% のオペランドの少なくとも片方が負数の場合、
剰余の符号は処理系依存でし。したがって、n %= (signed)N が正しく
動作しない可能性があります。
261246:03/10/01 06:51
>>260
情報ありがとうございます。
まだダメでしたか。
ふたたび修正してみました。ついでにreturnの剰余算を3項演算子に変えました。

unsigned advance( unsigned x , int n )
{
 unsigned const r = abs( n ) % N;
 x += ( n >= 0 ) ? r : ( N - r );
 return ( x < N ) ? x : ( x - N );
}

これなら、いかなるC/C++言語処理系でも正しく動作しますかね?
なんか、解読不能にしたいの?
return (x+ ( n%N )%N +N ) % N;
くらいでいいんじゃないの? 
>>262
おまいは上の議論を読んでいないのかと。
264デフォルトの名無しさん:03/10/01 15:08
キーボード入力による割り込み方法を教えてください
265262:03/10/01 15:14
ああ、ちょっと%の数が不足してるね。

Nをたとえば10として
n%N は nが負数の時 例 -13 なら -1 余り -3 か -2 余り 7 になるわけでしょ?

そしたら (n%N+N)%N は (-3+10)%10 か (7+10)%10 で 必ず 正の余りとなるし、
N<IntMax/2 ならこの計算は桁溢れもしない。

だから、これを重ねたらいいんじゃないの?

加減算の都度、%を入れればいいと思うのだが?
>>264
C言語そのものでは割り込みをサポートしていません。
スレ違いを超えて答えようとしても、
キーボード入力が割り込みで処理されるかどうかはシステムによるので
お答えするのは難しい。
一応参考までに
double x = -1.5;
int i = (int)x;
で i が -1 か -2 かは実装依存な

>>264
^C
>>264 man signal
270246:03/10/01 23:57
>>265
> Nをたとえば10として
> n%N は nが負数の時 例 -13 なら -1 余り -3 か -2 余り 7 になるわけでしょ?

そうなんですか?
商が -1 なのは確定で、余りが 3 か -3 かが実装依存だと思ってました。
C言語を勉強してまもない初心者ですが、難しいというよりややこしいと感じます。
例えば
char a;
だと a は変数の値なのに、
char a[10];
だと a は配列a[0]のアドレスになる。
同じ a と表記してあっても意味が違ってきてしまう。
プログラム中に出てきても瞬時に判別しづらい。わざわざ宣言を見なくちゃならない。
配列の時 a だけだとエラーになった方がわかりやすいんじゃないですか?
(つまり必ず&a[0]と書くべき)

あと a += 1 とかいう表記。
素直に a = a+1 のままでいいんじゃないかと思うんですけど。 

何か自分の無知ゆえにこんな事を思ってるだけだと思うので皆さんの意見を聞きたいです。
272z:03/10/02 00:07
すみませんが、C言語で、文字列から1文字を消去するなら、どうすればいいんですか。
例えば、a a b c de f → aa b c de f
char str[] = "a a b c de f";
memmove(str + 1, str + 2, sizeof str - 2);
strcpy(delchrptr,delchrptr+1);
>>271
まず、 char a と char a[]、
C 言語は配列とポインタが扱い一緒だからねぇ。
char* a ってやって a[i] ってやってもOK。

a += 1 の方、86 系の CPU って昔は
アキュミュレータっていう特殊なレジスタ持ってて、
オペランドの片方は必ずアキュミュレータに入ってないと駄目で、
結果の書き込みは必ずアキュミュレータに格納される。
要するに、a += 1 みたいに、オペランドの片方と結果の格納先が一緒だったわけ。
a = a + 1 って書くよりも a += 1 の方が計算効率いいの。
いまどきのコンパイラは a = a + 1 って書くと最適化で a += 1 と同じコード吐いてくれるけど。
The strcpy() function copies the string pointed to by src (including
the terminating `\0' character) to the array pointed to by dest. The
strings may not overlap, and the destination string dest must be large
enough to receive the copy.
>>271
strcpy(&dest[0], &src[0]); なんてやってたら死ぬべ
278z:03/10/02 00:24
ありがとうございます
279デフォルトの名無しさん:03/10/02 00:32
2から1000までにある素数を表示したいのですが
どういう条件で素数を表せばいいんですか?
>>279
それこそが そのプログラムの主眼なんじゃん?
人に聞いたら意味無いよーな・・

それともアルゴリズムを楽しみたいんじゃなくて、単なる手段なのかな。
>>279
スレ違い、且つ既出。
>>275
おいおい・・・
Cと86系CPUのどっちの方が古いと思っているんだ?
>>282
正確には86じゃないけど、4004 なら1971年。
C言語は1972年。
まあ、intel CPU に限らず、オペランドと結果の格納先が同じ CPU はあるっしょ。
>>271

open_wide_and_swallow_their_meang_of_life[by_the_way][on_the_way]=open_wide_and_swallow_their_meang_of_life[by_the_way][on_the_way] + 1;

なんてやってたら死ぬべ。読みにくいべ。


open_wide_and_swallow_their_meang_of_life[by_the_way][on_the_way]+=1;

簡潔だべ。前に比べて読みやすいべ。
>>283
オペランドと結果格納先が同じとゆうか
昔のCPUは大抵
アキュムレータ=アキュムレータ+オペランド
の形だね。

ADD operand
のように命令ニーモニックとオペランド1個だけを指定して
アキュムレータは暗黙のうちに使われる事になっていた
286271:03/10/02 01:59
皆さんレスありがとうございます。

今まで単純な変数名でやってきたのでこれらの疑問が湧いてきたんですけど、
確かに簡潔に書けたほうがいい場合もたくさんありますね。
(>>284 そんなに長い名前は使ってはいけない、というのは駄目でしょうかw)

場合に応じて使い分けようと思います。
>>271
云々以前に、a なんて変数名使ってるプログラムはゴミ箱直行。
char a;
あちゃー


なんちゃってーウヘヘヘ
>>270
  y/x=a y % x=b なら y=a*x+b とならなければいけません。

-13/10 == -1 なら -13 % 10 == -3 だけが答えです。
>>275
何でそこで86系が出てくる?
a+=1てえのはBのa=+1を踏襲しているもので
BはPDP7だろうがよ
68kとか言うならまだしも
>>287
俺カウンタとかに使ってるよ・・。
BってCの偽物じゃん。そっくり!
>>292
お前は自分の親が自分にそっくりだからって、
親が自分の偽者だというのか。
>>293
お前はせかっくのネタふりに、そんな答え方しか出来ないのか。
今時B知っててそういう事情を知らない筈がないだろ。
B言語とC言語の関係を知らなかった >>292 は慌てて >>294 のレスを返しました。
>>292 のネタ振りに気づかなかった >>293 は慌てて >>295 のレスを返しました。
297デフォルトの名無しさん:03/10/02 16:44
char *buff;
buff=(char *)malloc(1024*sizeof(char));

となっている時に
scanf("%s",buff);

fgets(buff,1024,stdin);

はどう違うのでしょうか?
っていうか、BとCって全然ちがうのだが。
>>297
scanfは空白は読み取らない
fgetsは空白関係なしに改行まで読み取る。
301294:03/10/02 17:11
>>297
scanf("%s",buff); は区切(改行や空白など)が無く 1023文字以下でなければ バッファオーバフローの可能性がある。
fgets(buff,1024,stdin); はヌルが書かれない可能性がある。


>>298
もうそれは流れた話題。
302297:03/10/02 17:33
>300-301
有難うございます
303デフォルトの名無しさん:03/10/02 19:28
>>301
> fgets(buff,1024,stdin); はヌルが書かれない可能性がある。

どういうこと?ヌルが'\0'のことなら失敗さえしなければ書き込まれるけど。
失敗した場合はscanfでも書き込まれないはずだし。
C言語を勉強し始めてはや幾日

リスト構造のところで
空のデータを指すポインタ、、、NULLが、、出た時



無性に感動しました。
>>304
しかし、それは長くは続かなかった。
まさかあんな所で挫折をするなんて・・・
>304
とりあえず、ヌルポヌルポッと叫んでみましょう
Cは本読んだだけですぐC++始めたから自分でリスト実装したことねぇや・・・
しろって言われたら出来ないかもw
308デフォルトの名無しさん :03/10/02 21:33
1バイト文字と2バイト文字を上手くファイルから読込みたいのですが、
どうすればいいのですか?
>>308
他人がわかるように質問書け。
>>309
そんなレベルの人に聞いてません
>>308
気合を入れて読み込め
>>308
まず1バイト読み込む。
読み込んだ文字が2バイト文字なら、もう1バイト読み込む。
>>312
すげー!!
その方法だと3バイト文字にまで拡張できそうじゃないですか!!
魔法みたいだよ。マジすげー
すげー!!

すげー!!

すげー!!

すげー!!

すげー!!

すげー!!

すげー!!

すげー馬鹿だー!!
>>301
> fgets(buff,1024,stdin); はヌルが書かれない可能性がある。
fgets はヌル文字終端が保証されています
>>313
あのー、基本的に可変長の文字コードとかエスケープシーケンスで
文字集合を切り替えるようなものって、頭から順に1バイトずつ読んで
場合ワケするしかないのでは?

もしかして、何かもっと画期的な手法でもあるのかな。どきどき。
>>315
fgets() が読み取りエラーをした場合、配列の内容は不定。
んでも、NULL が返ってくるから配列なんか見ないけどね。

可能性という点では、無きにしも非ずかな。
318デフォルトの名無しさん:03/10/03 00:57
ファイルに1行ずつ2万個のデータがあり、これを大きい順に並べ替えしようと思い、
ループを2重にして、大きいものをピックアップしていくやり方?でソートしてみたのですが、
うまくいきません。データ量を少なく20行ほどにすれば正常にいくのですが・・・
大量のデーターをソートする方法って何かありますか?
>>318
STL使え。
>>318
選択ソートよりは挿入ソートの方が速い
>>318
メモリに全部読み込んでqsort。
>>321
そやね
データがintなら80KB,
1KB程度の文字列なら20MB程度で済む
323318:03/10/03 02:04
いろんな意見ありがとうございます。
STLとかいうものを覚えとくと後々便利そうなのでそれを使う方向でやってみようと思います。
いろいろありがとうございました。
大量のデーターというなら1億個以上はないとな
>>315
ゴメン勘違いしていたよ
1023文字目で打ち切って ヌル文字が入るんだね
326C++初心者:03/10/03 08:08
正の整数を読み込んでその整数の下1桁を表示するプログラム

↑こんなのもわからないDQNですがおながいします。
>>326
#include <iostream>
#include <iomanip>
using namespace std;
int main(void) {
 long i;
 cin >> i;
 if( i < 0 ) cout << "minus error!";
 else cout << i % 10;
 return 0;
}
328デフォルトの名無しさん:03/10/03 16:06
manページにはdefineしか書いて無い
エラー番号とそのDEFINEとの対応は
errno.h を見ればわかるけど、逆に
errno.h を見るまではさっぱりわからない。
perror()を使えば文章で表現されるけど
エラーメッセージとエラー番号との対応は・・・

エラー番号とDEFINEとメッセージ が分散されてて
適切なパッケージングが行われて無いので
大変煩雑な印象を受けるでござる。
329デフォルトの名無しさん:03/10/03 21:31
今関数を勉強してるんですがたとえばpowint関数とかでも
そうですが関数を定義しますよね?あれって覚えちゃえばいいんですか?
その関数を使うときには機械的に書いちゃえばいいわけですか?
意味不明
331デフォルトの名無しさん:03/10/03 21:50
じゃあ実際に書きます。練習もかねて。

#include<stdio.h>
int powint( int x, int p)
{
int y=1;

while(p-- > 0)
{
y*=x;

}

return y;
}

int main(void)
{
int i,j;

for(i = 0; i<=10; i++)
{
j=powint(2,i);
printf("%d\t%d\n",i,j);
}
return 0;
}
この上の部分の関数のプロトタイプ宣言?は
覚えて関数を使いたくなったらただ書くだけでいいんですよね?
わざわざこんなことするんだったら数文字にまとめちゃえばいいのに・・・
意味不明
333デフォルトの名無しさん:03/10/03 21:53
>>331
ますます言いたいことが分からないYO!
プロトタイプ宣言が必要かどうか聞いているの?
334デフォルトの名無しさん:03/10/03 21:57
>>333 いや必要だと思ってるんですがプロトタイプ宣言で
使う関数の定義をしてるんですよね?
たとえばpowint関数を使いたい場合その宣言を書きますね?
でその宣言を書きますがそれはあらゆる状況でも同じものを
書けばいいんですか?ということです。そうであるならば
宣言はすべて丸暗記してしまえばいいのかなあと思って。
わかりにくくてすいません。
335デフォルトの名無しさん:03/10/03 21:59
>>334
プロトタイプ「宣言」
定義は実際に処理を書いたもの。

> それはあらゆる状況でも同じものを書けばいいんですか?
同じ関数ならもちろん。
覚えるんじゃなくてヘッダーファイルに書いてそれを複数のファイルからインクルードすればいい。
>>334
331の最後の一行の意味がわからない
337デフォルトの名無しさん:03/10/03 22:03
>>335 サンクスです。マジうれしいですw
やったあ、これで難解な関数もらくらく突破できそうです。
マジでサンクスです。
10月中に中級レベルの内容まではマスターするぞ!
難しいけどマスターすればいろんなことできるし。
338デフォルトの名無しさん:03/10/03 22:05
>>336 いちいち長ったらしく文章を書くんではなく
簡単にできたらいいのにと思ったんです。
>>337
ところでさ、↓は理解しているよね?

int func(int,int); ←これはプロトタイプ宣言

int func(int a,int b) ←これは関数の定義
{
return a*b;
}
340デフォルトの名無しさん:03/10/03 22:10
>>339 わかりました。サンクスです。
unsigned short型の変数にキーボードから正の整数を入力し、16進数で表示する。
さらに上位バイトと下位バイトを反転し、結果を16進数と10進数で表示するプログラムを作れ。
という問題なんですが・・・

#include <stdio.h>
main()
{
unsigned short a,b;
printf("Input number ");
scanf("%d",&a);
printf("16進数 %x\n",a);
b = a << 8;
a = a >> 8;
b = a | b;
printf("実行結果\n\n");
printf("16進数 %x\n",b);
printf("10進数 %d\n",b);
}

これでいいんでしょうか。
>>341
実行すれば分かるでしょ?
scanf の %d に &a はまずいだろ
344342:03/10/03 23:21
明らかな間違いがひとつ。
scanf("%d",&a);は間違い。scanf("%hu",&a);が正解。
345341:03/10/03 23:34
%huはまだ習ってないです。
100をいれて実行すると
結果 16進数・・・6400
   10進数・・・25600
と表示されるんですが、これがあっているのかが分からないんです。
>>345
Windowsの電卓なら関数電卓にして16進とか出せるぞ
>>345
習っていなくても%huにしなければならない。%dはintに対するもの。
348341:03/10/04 00:21
結果は関数電卓を使って確かめました。
とりあえず解決です、サンクス。
Cを勉強する前に
16進数や2進数の勉強をしたほうが良さそうだが
>>345
おまいは小学生か!!
習ってないことでも調べて回答するのが課題だよ。

10進数で100と入力して,10進数…25600 と表示されるのが正しいのか?
>>350
バイトスワップ
あ,スマソ。
353341:03/10/04 00:38
>>350
いままで授業の復習のような簡単な問題だったんで・・・。
ヒントが 「<<,>>,|,8を使おう」だから。
shortが2バイトで1バイトが8ビットの保証は無いと思う
shortが2バイトの保証は無いけどそれ以前に
shortが2バイトじゃない処理系は捨てると思う
356デフォルトの名無しさん:03/10/04 00:44
授業や試験の為のプログラム
ってのもなんか可哀想だな・・・。

意味ないとはいわんが・・・
*(unsigned char *)&a^=*((unsigned char *)&a+1)^=*(unsigned char *)&a^=*((unsigned char *)&a+1);
>>354
何に対するレスかわからんし、単なる独り言なのかもしれないが、
特定の環境では充分保証があるぞ。
C言語の「仕様」と「実装」の問題なので、意味も無く恐れる必要はない。
見たことも聞いたこともないマシンだがANSI Cが存在する環境に移植される可能性がある場合のみ、
1バイトが8ビットでない可能性に怯えるが良い。
>>353
ヒントがそれなら、意地でも使わずにやってみせろ!
>>359
やってみたよ(゚∀゚) >>357
有名な未定義のやつじゃないか?
>>359
リトルエンディアンの処理系なら htons と printf を使え
>>353

b = a * 256;
a = a / 256;
b = a + b;

って書けば先生には嫌われそうだねw
>>361
未定義じゃないよ。整数しか交換できないやつ。
>>364
上位バイトと下位バイトが同じとき失敗する
>>365
要するに0や65535を入力したときか?
失敗しないけど。
http://www.catnet.ne.jp/kouno/c_faq/c10.html
これの10.3には引っ掛からない?
>>366
本気?
XOR A,A
がどうなるか分からないの?
ああ、あのシッタカジョキョージュねw
union
{
 short s;
 char c[sizeof(short)];
} a;
以下略
>>368
>>357の場合それはありえない
>>368
↓どう説明する?

Input number 65535
16進数 ffff
実行結果

16進数 ffff
10進数 65535

Input number 7196
16進数 1c1c
実行結果

16進数 1c1c
10進数 7196
>>365
上位バイトと上位バイトを交換する
  or
下位バイトと下位バイトを交換する

の時だろ失敗するのは
a^=b aとbが同じでaが0になってもbは0にならないからね。
( ・∀・)つ〃∩ ヘェー
>>375
ヘェーなのかよ・・・ワラタ
a=b=56;
a^=b^=a^=b;
分解して
a^=b; /* a==0 b==56 */
b^=a; /* b==56 a==0 */
a^=b; /* a==56 b==56 */
>>377
( ・∀・)つ〃∩ ヘェー
>>365>>367-368
あくまでも
「同一の変数を二つの引数 として指定することはできない」
であって
「二つの変数の値が同じ場合は失敗する」
ではないのだよ
無駄に白熱して参りました
>>380
禿ドウ
382367:03/10/04 01:19
>>379
いや、一つの式内で(,演算子をのぞく)同じメモリ位置に複数回の変更を加えるのはダメと書いてあるみたいなんだが。
どのくらい、そしてどのような修行を積むとこのような議論が出来るようになるんすか?
ついてけないす。
考えるんじゃなくて感じるんだ!

じゃなくて・・・走らせてみせるんだ!
>>383
経験だ!
沢山痛い目にあう事。

っていうか、XOR ( a = b ^ c )を習えば分かりそうだけど・・・
>>382
ああ、そっちはよくシラネけど
マクロの副作用の話じゃね?
今更なんだけど、学校でCとか習う時代なんだ・・・
大学や専門学校じゃない?
>>386
マクロの副作用が正解
>>357をSWAP(a)というマクロにした場合
SWAP(a++)を実行すると意図したとおりの結果にならない
それはそれで逆に心配になってくるな・・・
関数にすれば問題無し
>>386,389
値を入れ替えるのに副作用のある引数を入れることを心配する必要はないと思う。
しかも”文法違反である”って書いてある。
複数回引数を使うだけなら標準マクロにだってあるよ。
関数なら一時変数を使う方法にするYO!
394383:03/10/04 01:52
>>384-385
サンクス。勉強のついでに基本情報処理受けてみます。
395デフォルトの名無しさん:03/10/04 10:01
もしかして皆さん、ライブラリとか関数とか
全て丸暗記してらっしゃるんですか?関数の問題点とかも?
>>389
&a++になるだけじゃん
>>395
そんなに数はないだろ
398デフォルトの名無しさん:03/10/04 11:15
>>395
使えば身に染み付くからものだから気にせんでもいいよ。

余り使ったこと無いものなどは再確認のためF1を押せばいい。

どうせ上級ライブラリやラッパー関数など
ローカルな呪文をわらわらと唱えることになるから

無理して丸暗記などせんでも・・・
>>395
丸暗記はしなくて良い。
ただ、こんな関数があったなあとは覚えておくべき。
どんな仕様だったか分からない場合は、
その都度調べれば良いだけだからな。
(・3・) エェー プログラミングは暗記力が問われるYO!
401デフォルトの名無しさん:03/10/04 12:32
つうかC言語勉強してる人たちってやっぱり専門学校とか
大学生が多いわけ?工業高校とかでも習ってるんだろうけど
Cは難しいからな。工業高校の人たちはほかの言語も勉強してるの?
最近は幼稚園のお遊戯でやるとか。
ちいさいころから Smalltalk とか Lisp をつかっていると
自分でおかたづけができなくなっちゃうからね。
>>400
プログラムでは曖昧な記憶に頼るな。
>>402
お前おくれているな。
この間、お遊戯会でアセンブリ言語やってたぞ。
406デフォルトの名無しさん:03/10/04 13:55
マジかよ!アセンブラ幼稚園でやるの?ハア?
天才だろ。
今のトレンドは、
生まれた瞬間からバイナリダンプの谷に突き落とす。
Cが難しいなんて言ってる奴はやめた方が良いんじゃねえか?
基本中の基本だぞ。
409デフォルトの名無しさん:03/10/04 14:39
ラップ関数が未だにヨクワカリマセン・・
ラップ関数が未だにヨクワカリマセンYO!
リードって便利だなっ♪
>>411
_readの事ですね!!
fリードって便利だなっ♪
YO!YO!チェキラ!
>>413
freadの事ですね!!
上のほうに書いてあった
func(&abc[0]);
みたいなことみんなやらないのか

なんとなく不安でいつもこう書いてるのだが・・
>>416
オレも、そうやってる。10年以上Cを使っているのに、恥ずかしながら
未だに配列とポインタの区別に自信がない。
>>417
・・・・・・・・・・・・
>>416
なにが不安なんだろう・・・
420デフォルトの名無しさん:03/10/04 17:43
構造体で

sei.kokugo = sei.kokugo + 2

って書くとどういう意味になるのでしょうか ?
421460:03/10/04 17:44
gcc Developer Station 2000って今どこからDL出来ます?
422420:03/10/04 17:45
回答を見る限り単純に sei.kokugo の値に + 2 されているわけではなく
値には変化がないのですがどういう意味なのか教えて頂けるとありがたいです。
>>420
sei.kokugoに2に足した値
424420:03/10/04 18:04
>423
すいません。いま適当に printf してみたら +2 の値になってました。
425デフォルトの名無しさん:03/10/04 18:16
for(x=2;x<=a;x=x+1)
このfor文で、x<=aをzを使って書き直したいんですが、どうすればいいんですか?

for(x=2;0<=z;x=x+1)
という形にしたいのですが。


for(x=2;0<=z;x=x+1){
   z=a-x;
}
で良いのでしょうか?
for(x=2; x<=a; ++x) で何が不味いの?
>>425
ダメ
428425:03/10/04 18:28
Cで作ったプログラムを元にCASL2でプログラムを書きたいのだけど、
for文が使えないから、for(x=2 ; 0<=z ; x=x+1)
という形にしたいのです。
言語云々の前にアルゴリズムがおかしいと思われ。
同じ事やるのに演算を少なくするのは何ややろうと変わらない。
>>425
if文で判定しる for( A; B; C ) X; は
A;
label:
if(B) { X; C; jump label; }
になおせるから
>>408
>Cが難しいなんて言ってる奴はやめた方が良いんじゃねえか?

Cをマスターしている人間が「Cは難しい」と言ってるんだと思う。
確かに、勉強中の人間がそう思うのなら、Cはやめて他の言語にしたほうが良いだろう。

>基本中の基本だぞ。

はぁ?なぜそう思う? >>408はCをどのぐらいマスターしているのかな。アセンブラは?
そして、何か他の言語はマスターしているのかな?
Cが基本中の基本だという意見に賛同する奴は少ないと思うが。
詳しい方教えてください。
WINDOWSのTCHAR型の"T"は"Two byte character"を意味してますよね?
size_t型やcaddr_t型とかの_"t"は何を意味してるんですか?
433 :03/10/04 21:23
わかって無い奴に限って簡単とか言い出す
>>432
typedefされた型だから「t」じゃないの?
>>434
つーか type の t なんだろうな
>>432
TCHARのTはTextのT。
TCHARのTはTバックのTとかって、そろそろ誰かが言いそうだ・・・

(・□・) アッ
ファイルの扱いの中でも、
wavの読み込み(波形表示や編集)・書き込み(入力によるwav作成)
などはどういう風にやればできるようになるでしょうか?
現時点ではがんばって調べてヘッダがわかったぐらいです。
よろしくおねがいします。
>>438
ここのスレで聞く事じゃないな。
440438:03/10/04 23:04
>>439
失礼しますた。
再度探しに逝ってきます。
TCHARのTはtransitionalのTじゃないの?
442438:03/10/04 23:08
F3かけましたが、見つかりませんでした。
よろしければ誘導おねがいします。
C-s をおすすめします。
446438:03/10/04 23:24
>>443
レスありがとうございます。
C-sとは何でしょうか?
わからず、ムダとは思いつつもググったらやはりムダでした・・・。
よろしければ指導おねがいします。

>>444
レスありがとうございます。
APIって聞いたことしかないのですが、そういう方向でっていうアドバイス
ですね?いちお「猫でもわかる」は覗いたことはありました。逝ってきます。

>>445
レスありがとうございます。
読み漁ったのですが、G.711って初耳でした。
これを使えってことでしょうか・・・?
447432:03/10/05 00:34
すいません。レス遅くなりました。
typeの"t"なんですね。
TCHARの"T"の方は意見が3つ^^;
兎にも角にもレスありがとうございました〜。
448デフォルトの名無しさん:03/10/05 15:36
int foo(const char** argc)
{
return 0;
}

int main(int argv, char* argc[])
{
foo(argc);   // a
return 0;
}

超初歩的ですが少し気になったので質問します。
こんな感じで配列に対して処理を行っていますが
これをコンパイルするとaの所でchar**からconst char**に変換出来ませんとエラーが出ます。
キャストしてやれば問題ないと思いますがなんか納得できません。
非constからconstへはキャストが普通は必要ないと思いますので。
出来ないという事は何か問題になることがあるのでしょうか。

環境はVC++6.0です
どーでもいいが、argc, argv が逆だ。
450わむて ◆wamuteW7DE :03/10/05 15:57
       . ∩*
 ,‐ ' ´  ヽ.ll l
/ i lレノ)))ll_l  ヽ
   人il.゚ ヮ゚ノll人     みるまらーーーー
    (ノY i⊃0
    く_l_ハ    
     ∪∪
>>448
int foo(char *const char[]);
452デフォルトの名無しさん:03/10/05 16:11
東京大学は、Macに対応しております。
>>448
一応気になったので突っ込んでおくが、Cではエラーにならないのでは?
C++ならエラーだけどな。ただし、VC++6.0を持ってないので、定かではないが。
しかし、char**からconst char**に変換出来ないのはなぜだ?
const char * const * には変換できるのに・・・。
教えて、えらい人
>>448
それを許すと、以下のコードが通ってしまうから。

 const char **cpp;
 char *p;
 const char c = 'A';

 cpp = &p;   // char** を const char** に代入できたとすると、
 *cpp = &c;   // これによって、p が &c を指すことになり、
 *p = 0;    // c が書き換えられてしまう。
455デフォルトの名無しさん:03/10/05 16:25
ヒープオーバーフロー、スタックオーバーフローってなんですか?
>455
お前な、全く自分で調べてないだろ。
ちょっとは調べろアフォ。
457あぼーん:あぼーん
あぼーん
>>454
int foo(const char *const *const argv) { return 0; }
int main(int argc, char *argv[]) { foo(argv); return 0; }
は、何故警告されるの?
const でガチガチに固めてあるのに。

MinGW + gcc3.2 で、foo() の呼び出しの所で
"warning: passing arg 1 of `foo' from incompatible pointer type"
型が違うからじゃないの?
460448:03/10/05 16:39
レス有難うございました。
>>449
あ、そうです、書き間違いですね。

>>451
今回はその方法を使わせていただきます。

>>453
あ、確かにC++です。この辺はCもC++も一緒(コンパイラオプションによる違いが有るくらい)
だと思ってましたので伏せてました。

>>454
なるほど、そういう事がありえるわけですか。勉強になりました。
461458:03/10/05 16:49
>>459
間違ってる?

char* を完全に const にしたら const char *const になる。
char** は const char *const *const になる。
>>458
一応報告。BCC5.5.1ではwarning出ません。
warningって、コンパイラによって、厳しい場合と甘い場合あるからね。
>>462
それって、ワーニングレベルの話でしょ。。。
Intel C で、でたワーニングでとれたバグもありました。
結構丁寧にワーニング出します。
464458:03/10/05 17:08
>>462
参考になりました。有難うございます。

const って微妙なんやなあ。使い辛い。
>>463
>それって、ワーニングレベルの話でしょ。。。

はぁ?

>Intel C で、でたワーニングでとれたバグもありました。

じゃあ、なぜ「IntelCで」などとコンパイラ依存の話を?
もともとwarningレベルの話じゃありません。
>>458
g++ 3.3.1 cygming で警告は出なかった。
467458:03/10/05 18:18
>>466
わざわざ有難うございます。
ちなみに、MinGW g++ 3.2 でも出なかったです。

警告が出たり出ないコンパイラがあるってことは、
未定義ってことかも。
468デフォルトの名無しさん:03/10/07 02:49
C FAQ 2.6にあったこの宣言をするとどうして
配列namestrが複数の要素を持つように振る舞うのでしょうか。

struct name {
int namelen;
char namestr[1];
};
>>468
その宣言だけじゃ
>配列namestrが複数の要素を持つように振る舞う
には為らないと思うが?
要素が0と1って意味で複数なのか?
>>468
namestr の要素数が1である事に意味は無い。
malloc で多めに確保して、struct name のサイズからはみ出た分を
namestr[10] みたいに namestr の配列要素であるかのように利用する。
もしまだ入門段階で、ローカル変数やグローバル変数ばかりで
ヒープの扱いを知らないならわからないかもしれないけど
いずれわかると思うよ。

char *myname = ...;
struct name *p = (struct name *)malloc(sizeof(*p) + strlen(myname));
strcpy(p->namestr, myname);
みたいな感じで。
472468:03/10/07 03:20
>>470
サンキュです、ありがとうございます!
ところで具体的な使い方はどうなっているのでしょうか

name_ptr = marroc(sizeof(name) * 10);
name_ptr->namestr[10] = 'a';

みたいな感じなのですか?
473468:03/10/07 03:25
すいません >>471 まだ読んでませんでした。しばらく自分でいろいろ書いてみます.

ところでK&R読めばこういった話しもわかるのでしょうか?
いまどきK&(ry
>>469
おばか・・・
476438:03/10/07 10:12
戻ってきました。
win32APIはほとんどVBで使われてるみたいですが、
Cで作りたいのです。
Cでは波形を扱うソフトを作るのにwin32APIを使うのでしょうか?
それとも他に切り口があるのでしょうか?

よろしくお願いします。

> win32APIはほとんどVBで使われてるみたいですが、
何が「ほとんど」だ、もう少し調べて来い。
>>476
>>1を読もう。
>標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
>>472
使い方がわからないなら、使う必要なし。
特に472で自分で書いてるソースは痛すぎる。
FAQなんて知ってようが知らなかろうが、必要なときがくれば分かる。
>>474 は K&R の練習問題すら解けないバカ。
>>480はK&R読んでも理解できない馬鹿
>>481はK&Rすら知らないDQN
>>482はK&R
>>483はS&B
>>484はS&W
>>485はグリ&グラ
>>486はP&G
488デフォルトの名無しさん:03/10/07 23:28
>>487はテ(ry
ageてしまいました
ごめんなさい


>>488はト(ry
言いたいことはハッキリ言え!!ボケナスどもが。
>>491
大好き
493491:03/10/07 23:38
>>492
じゃっ、つきあおうか!?
494デフォルトの名無しさん:03/10/07 23:42
何気に >>468>>470 の意味が分からないのはヤヴァイですか?
struct name {
  int namelen;
  char *namestr;
};
で、良いと思うのですが。
>>494
それでいいと思うならそれでいいじゃん、面倒だけど。
いや、それが「本来の」正しいやり方。
可変長構造体を使うと速度とメモリ使用量の面で有利になるというだけで。
497494:03/10/07 23:49
面倒だからだったのか・・・。
面倒臭がりすぎ。
>>494
文字列を格納するための領域の確保が別に必要である事に注意すれば、
その方法でもなんら問題はない。
499494:03/10/07 23:50
可変長構造体ってのは初耳だなあ。
全然勉強が足りてない証拠か。
>>494
>468の手法は、可変長配列のように見せかけているところに意義を見出すためのもの。
>494のようにポインタを持つと二回アロケートしないといけなくなるからそれを避けたいわけ。
ある関数に、引数としてポインタ変数を渡し、関数から処理が戻ってくると、
その変数が適切な箇所をポイントしているようにするにはどうすればいいんでしょう?

〜前略(変数はすべて同じ型)
a = NULL;
func(&a); //警告:問題のあるポインタ変換
//このあとaはpointerが示す先をポイントしていたい
〜中略
func(*b) {
〜中略
 *b = pointer; //エラー:移植性のないポインタ変換
}
〜後略

関数の戻り値を代入するのは変数ひとつに限られるため、引数として渡したいのですが・・・
検索するにも何をキーワードとしてよいのやら・・・どうかお知恵をお貸しください。
>>494-497
全然違います。
使いどころを説明するが面倒なので、説明しませんが、例えば画像ファイルとか・・・。
503494:03/10/07 23:55
皆さん有難うございます。
どうやら、面倒 + malloc() の管理領域とかフラグメンテーションの問題があるとかで。
理解出来ました。有難う。
面倒なんて言ってるのは一人だけ
ファイルフォーマットの場合は
ヘッダの直後にデータがついている形式のものを
「ソース上で」可変長構造体のように扱っているだけ。
>>502の方がそれこそ「全然違います」。
(プロセス|スレッド)間通信のメッセージで、各メッセージで個別のデータがある時、
その各データ部をそれぞれのメッセージに対応した構造体のポインタ型変数にキャストで代入して参照とかしたりしてるな〜。
ヘッダとボディをそれぞれ別のポインタで指して参照しても同じことができますが
>>506
union というものを知ってるか?
509デフォルトの名無しさん:03/10/08 00:26
初期化していないメモリの読み出しとか、free されたメモリの再free といったソースコードの不具合を摘出するツールって、purify しかないんでしょうか? OSはHP-UXでつ。
よろしくお願いします。
purifyは静的解析ツールじゃないよ。
511デフォルトの名無しさん:03/10/08 00:37
>>509
ありません。自分で作りましょう。
512 z:03/10/08 00:42
平均って「avg」だっけ?
513 z:03/10/08 00:45
ちなみに分散はなにが(・∀・)イイ!!と思う?
514デフォルトの名無しさん:03/10/08 00:45
>>512
averageよ☆
>>512
略してavgeだな。
516デフォルトの名無しさん:03/10/08 00:48
>>503
direntとかがそのテクニックを使ってるよ
518494:03/10/08 01:16
>>517
参考になります。ありがとう。
http://www.wakhok.ac.jp/~maruyama/Syscall/inode/section3.5.html
519デフォルトの名無しさん:03/10/08 01:16
>510
ありがとうございます。lint というツールでもだめなんでしょうか?

あとpurifyの宣伝によると、初期化していないメモリの読み出し を検出できるとありますた。
520デフォルトの名無しさん:03/10/08 01:19
>>519
>ありがとうございます。lint というツールでもだめなんでしょうか?

駄目です。

>あとpurifyの宣伝によると、初期化していないメモリの読み出し を検出できるとありますた。

そのコードを実行すれば検出できますが、実行しなければ検出できません。
つまり、C1カバレッジのテストを行わなければ、網羅的なチェックは出来ません。
>>520
lintは文法チェッカだから当然として…

動的チェックしかできないということか
警告が出ます。
void clear(int *p) {
 *p = 0;
}
int main() {
 int vec[1][1][1][1][1][1];
 vec[0][0][0][0][0][0] = 1;
 clear(vec);
 printf("vec[0][0][0][0][0][0] = %d\n", vec[0][0][0][0][0][0]);
 return 0;
}
523デフォルトの名無しさん:03/10/08 01:22
>>522
エラーや警告が出るときはそのメッセージを書けて何度言ったら(ry

void clear(int *p) {
clear(vec);
互換性のない型へのポインタ
524デフォルトの名無しさん:03/10/08 01:38
void test(int a,int b,intc)
{
int x[a][b][c];

このようなxを使いたいときcalloc関数やmalloc関数を使いますよね。
3次の配列のときはどのようにやればいいんですか?よろしくお願いします。
>>524
2次の配列のときはどのようにすればいいか知っていますか?
>>521
とはいえ、purifyはテスト工数を大幅に削減してくれるので、あるにこしたことありません。
HP-UXバージョンはいくらなのか知りませんが・・・
ちなみにWindowsバージョンは、カバレッジテストツールと、後もうひとつ何か(忘れた)がセットに
なっていて、10万円切ってます。
>>525
一応、自分で作ったのではないのですが、プログラムはあります。
でも、それだと3次のやつができないんです。
>>527 の言動から DQN であると確信しました。
529デフォルトの名無しさん:03/10/08 01:46
回答する気がないなら書き込むなよ っと
>>524
マジレスしてやるが、
二次元配列の確保の仕方が分からんと、それ以上は無理だということ。
531デフォルトの名無しさん:03/10/08 01:52
>>530 2次元のときは
x = (double **)test(ysize, xsize, sizeof(double));


void **test(int x, int y, size_t size)
{
int i;
void **ptr;

ptr = calloc(x, 32);
if(ptr == NULL) {
fprintf(stderr,"Error!\n");
exit(1);
}
for(i = 0; i < x; i++){
ptr[i] = malloc(y * size);
if(ptr[i] == NULL)
return NULL;
}
return (ptr);
}

です。
>>524
int (*x)[4][5];
x=malloc(3*4*5*sizeof(int));
533デフォルトの名無しさん:03/10/08 01:54
>>531
> ptr[i] = malloc(y * size);

*ptrの大きさが分からなくてエラーになると思いますYO!
手持ちのソースを見せても何にもならんよ。
535533:03/10/08 01:56
あ、void **だからいいのか。勘違いした(鬱
536デフォルトの名無しさん:03/10/08 01:58
>>532さんのやりかたでやってみます。ありがとうございました。
>>533->>535 ありがとうございました。
int x[a][b][c]としてbとcが固定じゃないとだめじゃないですかぁ〜と戻ってくるに一票
それすら気付かず、動きませーんと戻ってくるに一票
539デフォルトの名無しさん:03/10/08 02:04
>>537
あたりです・゚・(つД`)・゚・
>>539
>>531のプログラムってのが誰かが書いたものなんだろうが、あれをどこまで理解しているんだ?
void *test(int x, int y, int z, size_t size)
{
return malloc(x*y*z*size);
}

これでいいと思うんだけどネ 受け取る側が適切なポインタで受けていれば。
>>541
プロトタイプを見た時に印象が違ってくるでしょ
543デフォルトの名無しさん:03/10/08 02:13
void **test(int x, int y, size_t size)
{
int i;
void **ptr;

ptr = calloc(x, 32); //32の大きさでx個配列を確保
if(ptr == NULL) {   //取れなかったら終了
fprintf(stderr,"Error!\n");
exit(1);
}
for(i = 0; i < x; i++){
ptr[i] = malloc(y * size); y*sizeの大きさで配列を確保
if(ptr[i] == NULL)     取れなかったら終了
return NULL;
}
return (ptr);   返す
}


このくらいです
一つ一つの命令が理解できても、
全体として何をしてるのか理解してないんじゃあ・・・
> ptr = calloc(x, 32);

なんでptr = calloc(x,sizeof(void *));じゃないんだろう?
546デフォルトの名無しさん:03/10/08 02:19
>>544
そうなんです(´・ω・`)
>>545
自分が作ったのではないのでわかりません。
547545:03/10/08 02:24
書いた人の環境でポインタが32ビットだから32にしたとか・・・
ここはビット数じゃなくてバイト数だよ(^_^;)
548デフォルトの名無しさん:03/10/08 02:25
void sakana(int a,int b,int c)
{
x=(double **)test(a,b,c,sizeof(double));

何で教えてくれないんですか?これで呼び出しますので
test関数を教えてくださいm(__)m
>>548
テストしていないが
void *test2(int x, int y, size_t size);
void *test(int x, int y, int z, size_t size)
{
int i;
void **ptr;

ptr = calloc(x, sizeof(void *)); //32の大きさでx個配列を確保
if(ptr == NULL) {   //取れなかったら終了
fprintf(stderr,"Error!\n");
exit(1);
}
for(i = 0; i < x; i++){
ptr[i] = test2(y,z,size); y*sizeの大きさで配列を確保
if(ptr[i] == NULL)     取れなかったら終了
return NULL;
}
return (ptr);   返す
}

550つづき:03/10/08 02:32
void *test2(int x, int y, size_t size)
{
int i;
void **ptr;

ptr = calloc(x, sizeof(void *)); //32の大きさでx個配列を確保
if(ptr == NULL) {   //取れなかったら終了
fprintf(stderr,"Error!\n");
exit(1);
}
for(i = 0; i < x; i++){
ptr[i] = malloc(y * size); y*sizeの大きさで配列を確保
if(ptr[i] == NULL)     取れなかったら終了
return NULL;
}
return (ptr);   返す
}
551デフォルトの名無しさん:03/10/08 02:35
>>549
ありがとうございました。
552501:03/10/08 08:17
(´・ω・`)・・・
>501
言ってることがよくわかんないんだけどさ、
例えば
char *a = NULL;
func(&a);
printf("%s", a);
が正しく動けばいいってこと?
だったら
void func(char **a) {
 *a = "Hello world.\n"
}
でいいんだけど。
554501:03/10/08 09:01
>>553
ううっ、**が出てこなかった・・・
ありがとうございました、精進してきます・・・
>>550
キショいからやめれ
ANSIとK&Rの混在
556デフォルトの名無しさん:03/10/08 22:39
>>552
意味がわからんので答えられん・・・
>>556
たぶん、これのことだと思う

http://gcat.que.ne.jp/miruri/Chin/Kaiin/1_10/Chin1_10.html
>>557
嘘つき
>>557
精神的ブラクラだな・・・
犬の顔かと思ってたけど、よく見ると違ったんだな・・・。
捕手しておくね・・・。
お前ら!ファイルに、半角文字や漢字などが使われていて
それをfgetcで読みこんで、標準出力に1文字ずつ出力しようとしたら
漢字がうまく表示されなかったんだが、どうしたらいいかお前ら教えてください。
563デフォルトの名無しさん:03/10/10 17:19
>>562
ワイド文字
>>562
kterm 使え。
565562:03/10/10 17:40
お前らお願いです、簡単にやり方見せてください。
>>564kterm使うとどうかなるんでつかね?
>>562
その前に作ったソース晒せ。
宿題は自分でやって下さい
>>567
宿題じゃないでつよ。ソースは今ないんでつが、↓のようではだめらしいでつね。
正しいやり方を教えてください。
#include<stdio.h>
#include<stdlib.h>
int main(void){
int i,c;
FILE *f;
if((f = fopen("morehatensaidetune.txt","r")) == NULL){
printf("file open error\n");
exit(1)
}
i = 10; /*とりあえず10文字*/
while(i--){
c = fgetc(f);
printf("%c\n",c);
}
fclose(f);
return 0;
}
- printf("%c\n",c);
+ printf("%c",c);

cat morehatensaidetune.txt
でうまく出てるのかと。
>>568
一文字ずつ改行しなくていいなら>>569
するなら>>563
while(i--){
 c = fgetc(f);
 if(c == '漢')continue; /*漢は出力しない*/
 printf("%c",c);
}

こういう処理をやりたいときは、ワイドとか言うのをつかえばいいんでつかね?
コンパイラにもよるけどな。
574:03/10/10 21:01
file1の中身:This is test program
file2の中身:
1 program
2 b
3 ab
4 This
5 i
6 is
7 test
...
file1とfile2を比較して、file2にfile1と同じ単語があったら、
ファイル2からその単語と単語前の数字を出力する。
このプログラムを教えてください。
>>568>>572
どうでもいいがputcharを使えputcharを。
576562:03/10/10 21:16
>>575
わかりますた。
>>574
perlで組め
>>574
あんたがマルチした質問先でC++で書いたのならあったよ。
http://pc2.2ch.net/test/read.cgi/tech/1064541405/384
579:03/10/10 22:14
>>574
はcで書いてくれませんか。C++は全然わからないから、
おねが〜い
放置確定
放置了解
ttp://www3.realint.com/cgi-bin/tbbs.cgi?pointc2
ついでにここにもマルチしてまつね。
583デフォルトの名無しさん:03/10/10 22:24
Cの開発ってカーニハンも関わっていたの?
「やさしいC」っていう女の人が書いた参考書って、どんなレベルまでカバーしてるんですか?

「掲示板で質問する時はマルチはやめよう」という初歩的な事から書いてあります。

   12 名前:仕様書無しさん 本日のレス 投稿日:03/10/10 23:23
  やさしいCっていう女の人の参考書って
  どんなレベルまでかいてあるの??

>>585
嘘つくなよ(w
そんなこと一言も書かれていなかったぞ。
>>586
眼科に池
fwriteでどうやっても書き出せないよぉ〜(>_<)
と思ったら第三引数が1ではなく0になっていました アハハァp(´∇`)q
お気の毒
590デフォルトの名無しさん:03/10/11 02:35
次のプログラムは何がいけないんでしょうか?
char val1[100], val2[100];
scanf("%s,%s",val1,val2);
printf("val1=%s val2=%s\n",val1,val2);

これを実行して、aaa,bbbと打ってやると、
val1=aaa,bbb val2=
と出力されます。
val1=aaa val2=bbb
という風になってもらいたいのですが。
>>589
それだけ(/oT)

>>590
,も文字列の一部とみなされる。
scanf("%s%s",val1,val2); としてaaa bbbと入力させるか、
scanf("%[^,],%s",val1,val2); とする。
592デフォルトの名無しさん:03/10/11 02:45
>>591
ありがとうございます。それでできました。
これにはまって2時間も考えていました。ようやく寝られます。
>>591
その場合val1に入れたい文字列には半角スペースが入っていてもいいのですか?
よい
>>594
thx
596デフォルトの名無しさん:03/10/11 10:17
windowsコンソールプログラムの練習として、
プログラムそのものに引数をとりたいのですよ。
でも、それがうまくいかない。

#include <stdio.h>
void main(char str1[]){
puts(str1);
}

概要としてはこんな感じで、
test.exe abcdefとして起動してもエラー。
何がおかしいんでしょ?
main(int argv char *argv[])
>>597
それでgoogleったらでてきました。
アリガト。
私の奥さんがここに書き込みしているような人種だったら
マジで首を吊ります。
みなさん笑い事のように書き込みしていますが、まじめに働いている
夫に対してかなり屈辱的な裏切りをしています。
セックスがヘタだとか淡泊だとかいって、どうせロクに話し合っても
いないまま配偶者を裏切るなんて言語道断です。
たぶんあなたにお子さんがいたらまともに育たないと思います。
歪んだ親の価値観を押しつけられているんでしょう。

浮気を肯定するなら早く離婚すればいいじゃないですか。
子供を思うならなおさらそうするべきです。
これ以上、このスレを見ていると吐き気がします。
同じ日本人かと思うだけでも鳥肌が立ちます。

このスレの削除依頼を出しておきます。
ん?
601デフォルトの名無しさん:03/10/11 12:38

先月の収入は $1500 でした。
始めてから半年、着実な副収入として私の家計を助けてくれています。
1つのコツは、あきらめないで続けること。すぐには収入にはつながりません。
なんとなく分かってきた”こつ”をお教えします。うまい話はありません・・・・
不通よりは早く収入に繋がるとおもいますよ!
http://www.mx-style.com/adad_01/affiliate.html
602デフォルトの名無しさん:03/10/11 13:49
>>597は何かおかしい。
変数の多重定義。パースエラー。
604597:03/10/11 15:24
何かおかしいというより、はっきりおかしい。
main(int argc char *argv[])
ね。

これはかなり恥ずかしい・・・

>>604
一度、ゆっくり休んだほうがいいぞ。
606デフォルトの名無しさん:03/10/11 15:29
文字列の前後にスペースやタブなどがあった場合、それを取り除いてくれる関数ってありませんか?
いくつかの言語(知ってる限りではjavaとvb)ではtrim()という名前の関数が
あるのですが。
607デフォルトの名無しさん:03/10/11 15:34
>>606
strtokでできないこともないけれど、自分で書いた方がいいと思う。
というわけで自分で書きました・・・
void trim(char* str)
{
  char *p1=str, *p2;
  while(isspace(*p1)) p1++;
  p2=p1;
  while(!isspace(*p2)&&*p2!='\0') p2++;
  *p2='\0';
  memmove(str,p1,strlen(p1)+1);
}
609HELP:03/10/11 17:48
#define TRUE 1
#define FALSE 0
#define LEFT 0
#define RIGHT 1
#define BALANCED 2

struct NODE{

/*key*/
char* word;
int hindo;
int number;

/*otherinfo*/
struct NODE* next;

/*child*/
struct NODE* child[2];

/*balance*/
int balance;
};
typedef struct NODE Node;
typedef struct NODE* Tree;

が与えられていて、単語順整列、単語頻度順整列、単語出現順整列を作りたいのですが
どうやって作ればいいのでしょうか? 教えてください。
>>609
宿題スレってもう沈んだったっけ?
>>608
"△ABC△DEF△" → "ABC" となるけど、それでいいのか ?
VB の Trim() は、"ABC△DEF" となったはずだが...。

あと最後の strlen() は p2 - p1 + 1 でいいんじゃないか ?
>>611
そっとしておいてやれ。
>>609
宿題じゃないなら,配列に突っ込んでqsort()。
>>613
思いっきりタン方向リスト用意されてるのにな。
615デフォルトの名無しさん:03/10/11 18:57
一次元配列のプログラムの例)dim[7]={この部分の数字}を
scan文で1つずつ入力できるようにしたい場合は
どうすればいいんでしょうか?
教えて下さいお願いします。
>>615
int scanf( char const*, ... );
int scan(void){ int result = 0; scanf( "%d", &result ); return result; }
int main()
{
int dim[7]={ scan(), scan(), scan(), scan(), scan(), scan(), scan() };
}
617デフォルトの名無しさん:03/10/11 19:08
\nで区切られた文字列から1行ずつ読みたいんですが、
標準関数にfgets()とgets()はあるのに、sgets()は無いんですか?
無ければ代わりになるようなものってありますか?
strchrで\nを検索すれ
>>617
*dest=0;
strncat(dest,src,strspn(src,"\n"));
620619:03/10/11 19:14
× strspn
○ strcspn
>617 自分でインデント直して使え。
typedef struct {
const char *first; const char *last;
} memreader;
static void memreader_open(memreader *mp, const char *start, int size){
mp->first = start; mp->last = start + size;
}
static int mgets(char *bufp, int size, memreader *mp){
const char *src;
int i;
if (mp->first >= mp->last)
return false;
src = mp->first;
size--;
if (src + size >= mp->last)
size = mp->last - src;
for (i = 0; i < size; ++i) {
if (src[i] == '\n') { bufp -= 1, i += 1; break; }
#ifdefWIN32
if (src[i] == '\r' && src[i+1] == '\n') { bufp -= 2, i += 2; break; }
#endif
bufp[i] = src[i];
}
bufp[i] = '\0'; mp->first += i;
return true;
}
>>621
indent コマンドを使え
>>621
> static void memreader_open(memreader *mp, const char *start, int size){

C で文字列扱うのに、size を渡すと言う変なインターフェースをよく考えつくもんだな。
mmap/CreateFileMappingを読み込むために作ったんでな
625621=624:03/10/11 21:48
だから末尾に'\0'すらつけられない状態で読みとらなきゃいけなかったんだよ
>>614
タン方向リストやらバイナリツリーやら元のデータ構造も目的もよくわからん。
こういうときは,非破壊的に新しい容器使うのが一番無難。
大量のエラー項目があったとします
エラー項目番号に対応する文字列を表示して終了する関数を考えるとき
どう実装すればいいでしょうか?

void my_error(int); で my_error(ERR_FILE_NOT_FOUND);
みたいに使うことを想定しています
628627:03/10/11 23:22
1.効率は良さそうだがerr_noとerr_strの対応を保証するのが難しい
void my_error(int err_no)
{
enum {ERR1, ERR2, ... , LAST_DUMMY};
char (*err_str)[] = {
"error1\n",
"error2\n",
...
};
if ( 0 <= err_no && err_no < LAST_DUMMY ) {
fprintf(stderr, "%s", err_str[err_no]);
exit(1);
}
}
629627:03/10/11 23:23
2.caseがerr_noを網羅しているか,重複がないか確認するのが難しい.コピペが増えるはずなので
効率は気にするほどではなさそう
void my_error(int err_no)
{
enum {ERR1, ERR2, ... };
char *err_str;
switch(err_no) {
case ERR1: err_str = "error1\n"; break;
case ERR": err_str = "error2\n"; break;
...
default: err_str = NULL;
}
if (err_str) {
fprintf(stderr, "%s", err_str);
exit(1);
}
}

自分ではこれくらい考えてみました
処理の途中にn秒間ディレイをしたいのですが
どのように書けばいいのでしょうか?
>>630
UNIX系
sleep(n);

Windows
Sleep(n * 1000);

標準Cの話題じゃないからこれ以上は別スレな
632630:03/10/12 00:19
どのスレが適任かわからずここに書いてしまいました。
ありがとうございました。
>>628
> char (*err_str)[] =
括弧はいらない。普通はつけない。
char (*err_str)[] だと pointer to array of char だと思う
char *err_str[] だと array of pointer to char にならない?
635633:03/10/12 04:06
>>634
だよね。
言い換えよう。

括弧はいらない。つけたら配列でないためエラーだ。
636デフォルトの名無しさん:03/10/12 16:01
デバッガーのDDDのマニュアルを読んでいたら、
dereferencing pointer
と言うのが出てくるのですが、これは日本語ではなんと言うのでしょうか。
そしてその意味も教えて下さい。
参照外し、あるいは逆参照
*演算子を適用すること
ここで聞いていいのかわかりませんが

ゲームパッドあるボタンが押されるとキーボードのコマンドが入力されるようなソフトを作りたいのです。
まぁ、簡単に言いますと、ワンボタンで波動拳が出るような感じで…
あるゲームの補助ソフトとして作りたいのですが、

DirectInputでパッドのあるボタンが押されると
プログラム側から、 コマンドを押す にはどうすれば良いのでしょうか?
639あきまそ:03/10/12 17:15
for(;;)
{
 if(...)
  break;
}
こんな感じの場合はfor文を抜けるんですか?
それと
for(;;)
{
 for(;;)
  {
   if(...)
    break;
  }
}
の場合は上から2番目だけのfor文を抜けるのですか?
640デフォルトの名無しさん:03/10/12 17:16
抜けます。
そうです。
>>638
>>1を見て、それでもここで質問すべき内容だと思うのであればあなたはプログラマに向いていません。
642638:03/10/12 17:25
>>641
いや、、DirectInputについて聞きたいのではなくてですね…
C的には、プログラム側でキーを押した事にするにはどうするのでしょうか?
と言う事です。

もしかしてこの処理はCでは出来ないのでしょうか?
キーなんて概念はありません。
あなたはプログラマに向いていません。
>>642
C 言語はそういう処理系依存の機能は持ってない。
VC スレか DirectX スレで聞いたほうがいい。
646638:03/10/12 17:32
ごめんなさい…
実は今日はじめてVC+Pro6.0を購入した所なんです。
さっぱり分からないもので、とりあえず手始めに〜 って感じで作ろうとしたのです。


…逝って来ます。
手始めに〜 って感覚でやろうって内容ではないな
実現にはあと3年くらいかかりそうだな。
649デフォルトの名無しさん:03/10/12 19:19
>>646
手始めに〜
プログラム入門書をオークションの中古品で良いから買え。
650HELP2:03/10/12 19:22
この間の追加なのですが・・・

#define TRUE 1
#define FALSE 0
#define LEFT 0
#define RIGHT 1
#define BALANCED 2

struct NODE{

/*key*/
char* word;
int hindo;
int number;

/*otherinfo*/
struct NODE* next;

/*child*/
struct NODE* child[2];

/*balance*/
int balance;
};
typedef struct NODE Node;
typedef struct NODE* Tree;

が与えられていて、線形リストの挿入を使って、単語順整列、単語頻度順整列、単語出現順整列を作りたいのですが
どうやって作ればいいのでしょうか? 宿題なのでソースをお願いします。
宿題スレってどこに逝った?
>>651
普通に1000逝ったけど。

次スレ
http://pc2.2ch.net/test/read.cgi/tech/1065535118/l50
>>650
平衡二分木の構造体で線形リストを作れと?
655HELP2:03/10/12 20:36
>>654
見れば分かるでしょう?
>>655
線形リストがどんなものだか知らないで書いてるだろ。
構造体定義時にメンバーのデフォルト値を指定できたらよかったのに(^o^)
わぁった。STL使え。
659627:03/10/13 00:08
>>635
括弧は取り除くとして…

1,2以外のやり方はありませんでしょうか?
アイディアをお願いします
660ヽ(・∀・)ノ:03/10/13 04:43
>>659
my_error(HOGE)で HOGE と出力するだけなら

#define my_error( UNKO ) printf( #UNKO )
>>660
UNKO に % が混じらないように気をつけろよ。
なんかうまくできないかと思っていろいろやってみたけどイマイチ

#define ERR_1 ERR_NOT_FOUND
#define ERR_2 ERR_READ
#define ERR_3 ERR_WRITE
#define MES_ERR_NOT_FOUND "Not found"
#define MES_ERR_READ "read error"
#define MES_ERR_WRITE "write error"

#define ERR_(n) ERR_##n
#define CAT_(x,y) x##y
#define ERRMES_(n) CAT_(MES_,ERR_(n))

こんな感じでERR_(1)がERR_NOT_FOUNDに展開されて
ERRMES_(n)がMES_ERR_NOT_FOUNDになればいいなと思うんだけど。
そうすれば配列にERR_(n)を並べるだけですむ。
663デフォルトの名無しさん:03/10/13 08:38
#include <stdio.h>
#include <shlwapi.h>

int main()
{
FILE *fp;
char str[] = "太郎 一郎 次郎 博美 香子 明美";
char *token = " ";
char *ptr;

fp = fopen("test.txt","w");
ptr = strtok(str, token);
while(ptr != NULL){
fprintf(fp, "%s", ptr);
ptr = strtok(NULL, token);
}

fclose(fp);

return 0;
}

文字列から全角スペースを除外するものを作りたいんですが、上のプログラムを実行すると

太郎一郎次郎博美克q明美

という風に表示されて、香子の部分がおかしくなってしまいます
恐らく香と全角スペースの文字コードが一致する部分があって、そのせいで香まで除外されてるんだと思うんですが、
これはどう解決したらいいんでしょうか?
全角用のstrtokを自分で作るしかないでしょうか?
>>617
>無ければ代わりになるようなものってありますか?
遅レスですまんが、そんなものはない。
それが必要ならば、これぐらいのコード量で済んでしまうから・・・
>>621は無視しとけ。)

char *sgets(char *s, int n, char **p)
{
    char *t=s;
    
    while(0<--n && **p!='\0' && (*s++=*(*p)++)!='\n')
        ;
    *s='\0';
    return t==s ? NULL : t;
}
>>663
wcstok()

>>664
> char **p

ダブルポインタ使えるって言う自慢のつもりなの ?
>>627
>エラー項目番号に対応する文字列を表示して終了する関数を考えるとき

「文字列を表示して終了する」だけなら、いっそのこと発想を逆転して
文字列のアドレスをエラー項目番号にしてしまえば?

char err_123[] = "error_123";

void f(int a){if(a) my_error(err_123);}
667663:03/10/13 10:42
>>665
wcstok()を使ったらきちんとできました
ありがとうございました
>>665
たぶん、ポインタを使いこなしてるって言いたいんだよ。
代入して使わないと、読みにくい上に遅くなるだけなんだけどね。
>>666
別のソースファイルからも使えるでしょうか?
atoc、atofのaってどういう意味だかご存知ないですか?
気になって眠れません。
ascii
>>668
> 代入して使わないと、読みにくい上に遅くなるだけなんだけどね。

て言うか、char *p で十分だろ ?
>>671
なるほど、ありがと。
>>669
もちろん。ただし使うときは extern を忘れずに。
>>672
いや、状態(どこまで読んだか)を保持できないから
呼び出し側でchar *の変数を用意して、そのアドレスを渡す形。
初期化後に呼び出し側で値を変えると破綻するけどね。
あ、でも戻り値にすればいいだけか。
すみません。
int型をconst char *に変換するにはどうすれば良いのでしょうか?
>>677
必要性がわからん
int i;
const char *p = (const char *)i;
680dajing:03/10/13 13:26
makeを実行中「フェーズエラー」が発生しました。
何のことでしょうか?
>>678
直接ハード叩く場合は必要。
しかし,そんな人間はこんなアホな質問せんだろう。

>>680
makeはCと全く関係ない,ただのコマンドプロセッサ。
去ね。
682dajing:03/10/13 13:45
こんなふうに標準ライブラリを重複して書いても
リンカー時に問題はおきないのでしょうか?
--------- A.c ----------
#include <stdio.h>
#include "A.h"
--------- A.h ----------
#include <stdio.h>
リンカー時?
684dajing:03/10/13 13:58
すいません。コンパイル時です>683
リンカー時というものはない。よって問題は起きない。
stdio.hは標準ライブラリではない。
それは複数回インクルードされても正しく使えるように実装されている。
よって問題は起きない。
687dajing:03/10/13 14:06
ありがとうございます。>686
ヘッダーファイルは何度インクルードされても大丈夫なように実装シル
>>986
ゴミ野郎にマジレスしないでください、調子に乗ります。
なんどインクルードされても大丈夫だが
コンパイル時間が掛かったり、
無駄に他のファイルに依存することになって
効率が悪い。
dajingよ、仮に問題が起きていないとして、それが
・手元の処理系でたまたまそうなっているのか
・規格で保証されているなら、それは何という規格の第何条か
までをはっきりさせないと解決したことになっていないぞ。
この話に限ったことじゃない、基本的なことだ。
692デフォルトの名無しさん:03/10/13 15:47
そういえばネットワーク関連のヘッダって
複数回インクルードすると死ねるのが
何個かあった気がする
>>689はゴミ野郎
>>692
さも一般論みたいな言い方はよくない。
具体的に晒せ。
696デフォルトの名無しさん:03/10/13 19:14
スレ違いかも知りませんが、学校の宿題あってるか見て下さい。
いいですか?
宿題スレへGO!
>>690
>無駄に他のファイルに依存

たとえば

#include <stdio.h>
#include "A.h"

のように使用されるA.hの中に

void fusianasan(FILE *);

があると

#include "A.h"
#include <stdio.h>

は許されないよな。

俺的には重複引用による不具合に対策してあるstdio.hを
A.hの中で引用していた方が、ヘッダの相互依存を隠蔽できる
と思うんだが、どうだろう。
699デフォルトの名無しさん:03/10/13 19:47
>>698
A.h内で#include <stdio.h>
>>699
ニホンゴワカリマスカ?
>>700
分かってたらこんな馬鹿なレス返さないだろ
>>700
わかる。最後まで読まない悪い癖はあるが。
> stdio.hをA.hの中で引用していた方が、
これか。
>>702
分かってたんならいいや
>>703
ごめんね。
変数をソース内で、マクロみたいに「展開」ってできるんでしょうか。
例えば、
double ele1, ele2, ele3, ele4, ele5;
な奴らを操作したいと思った時に、

int i;
char val[5];
for(i=1; i<=5; i++){// i を利用して連続操作
snprintf(val, 5, "ele%d", i);
$val = sqrt( 100*i );
// ↑ 勝手に作った '$'演算子で展開してele1 = sqrt(100), ele2 = sqrt(200) ..... としてるつもり
}

てな感じにしたいのですが、この様なことを実現する方法を御存知ないでしょうか。

/* 配列が使えない状況なのです */
>>705
配列が使えないってどういう状況だ?
'['のキーが壊れてて入力できないとか?
707デフォルトの名無しさん:03/10/13 20:52
708デフォルトの名無しさん:03/10/13 20:53
#include <stdio.h>

int main(void)
{
int num,i;

num = 0;
i = 0;

while(num<=4){
while(i<=2){
printf("numは%d:iは%dです。\n",num,i);
i++;
}
num++;
}

return 0;
}

うまく繰り返されないです。
どこに間違いがあるのか指摘してください。
>>705
自分でプリプロセッサ作るか、m4 とか使えばできるじゃないか ?

PL/I なら、標準のプリプロセッサで %FOR とかサポートしてるんだがな。
##でできるような
711705:03/10/13 20:58
>>706
変数は既に他から与えられてるんですよ。>>705 みたいな規則正しいやつが。
んで、そいつの処理が私の役目なんです。

数自体は10個程度と大量ってわけじゃないんですが、1ケずつ処理するのは
あまりにも「おバカ」かなと。。。。

/* 作った人は、配列だとゼロオフセットになってしまうのが気にくわんらしいです */
>>708
while の代わりに、for を使え。
そうしたら、間違いに気づくと思う。
>>711
> /* 作った人は、配列だとゼロオフセットになってしまうのが気にくわんらしいです */

そんな奴をプロジェクトからはずす方が先決だと思うが。
>>711
一旦、配列にコピーしてから処理して、終わったら元の変数に戻す。
715デフォルトの名無しさん:03/10/13 21:10
>>712
#include <stdio.h>

int main(void)
{
int num,i;

for(num=0;num<=4;num++){
for(i=0;i<=2;i++){
printf("numは%d:iは%dです。\n",num,i);
}
}
return 0;
}

やってみましたがわからないです。
もう少し細かく教えていただけないでしょうか。
>>715
ネタか ?

いったいどういう結果を求めていて、>>708>>715 の結果はどうなるんだ ?
717デフォルトの名無しさん:03/10/13 21:23
>>705
アドレスのテーブルを作成しれ。

static double *tbl[]={&ele1,&ele2,&ele3,&ele4,&ele5,};

for(i=0; i<5; i++)
    val[i] = sqrt( *(tbl[i]) );
>>715
whileの時はiとnumの初期化をループ外でやってなかったか?
719717:03/10/13 21:30
む?>>705はこういう意味か、スマソ。

for(i=0; i<5; i++)
    *(tbl[i]) = sqrt( 100*(i+1) );
720デフォルトの名無しさん:03/10/13 21:34
>>718
では、whileの時はどこで初期化すればよいのでしょうか?
>>720
722デフォルトの名無しさん:03/10/13 21:48
>>721
すいません。
あのやり方しか見たことないので他のやり方がわからないです。
>720
i の値の推移を追跡汁。
while(num<=4){
i = 0;
while(i<=2){
>>720
初期化が必要な場所でやるべきだと思うが・・・
>>723
言葉が難しくて理解できないです・・・。
具体的に教えていただけないでしょうか?
>>722
多分君はプログラマにはあまり向いてないと思うよ。
趣味でやるなら止めないけど、もし仕事にしようと思っているなら、やめたほうがいいと思う。
728708:03/10/13 21:54
>>726はスルーしてください。

解決しました。
皆さんありがとうございました。
>>727
何故ですか?
>>729
問題解決能力が人並み以下だから
>>730
今while文をやったばかりなので見逃してくだちい。
3重ループで、また聞いてくるヨカーン。
686がマジレスだと思うほうがどうかしている。
三段論法に見せかけて、ちっともそうなってないじゃないか。
>>733
三段論法 ? >>686>>682 の質問に...

こんなふうに標準ライブラリを
→ stdio.hは標準ライブラリではない。

重複して書いても (リンカー時に) 問題はおきないのでしょうか
→ それは複数回インクルードされても正しく使えるように実装されている。 よって問題は起きない。

と答えているだけだと思うが。
複数回インクルードされても正しく使えるように実装されているかは、
処理系によるのだが。
>>711
>数自体は10個程度と大量ってわけじゃないんですが、
>/* 作った人は、配列だとゼロオフセットになってしまうのが気にくわんらしいです */

enumを覚えなさい。
ANSI 準拠の処理系なら、(assert.h を除く) 標準ヘッダファイルは複数回インクルードしても一回インクルードしたときと同じ動作をすることが規定されてるよ。
ANSIはどうか知らないけれど、K&R2ndにはそう書かれているね。
ANSI C準拠の本だから規格でもそうなっているんだろうね。
assert.h はなんか違うの?
>>737
それはANSI規格票の第何条だ?

>>ALL
こちらでも調べればわかることだが
これが答えられない者が気安くANSIと
言っているのは全てネタだ
>>740
てめーで調べろ
>>739
includeされた時点のNDEBUGの定義の有無によって挙動が違う。
>>742
assert.h自身がNDEBUGの定義を変更することはない
>>743
誰もそんなこと言ってませんが。
745Not 743:03/10/14 01:00
#define NDEBUG
#include <assert.h>
/* ここでは無効 */
#undef NDEBUG
#include <assert.h>
/* ここでは有効 */
#define NDEBUG
#include <assert.h>
/* また無効 */

こういう挙動をするのか。知らなかった。
つーか部分的に無効にするなんて考えたこともなかった。
747705:03/10/14 02:53
沢山の御意見が。。。答えて下すった皆様、どうもありがとうございました。
自分の環境と照らしあわせて考えてみることにします。

// 個人的には >>711 あたりか
748705:03/10/14 02:54
>>747
s/711/713/
749デフォルトの名無しさん:03/10/14 03:58
ポインタの勉強をしているのですが、
用意した変数を&a見たいな感じで、アドレスを指定する方法は
分かったのですが、自分の見たいアドレスを(例えば0x00000000)
指定して、変数に代入するということはできますか?
>>749
代入は出来るが
int *p = (int *)0xXXXXXXXX;

逆参照した結果どうなっても知らんよ。
>>745
でも,それ,他のヘッダに対して使うなよ。
assert.h以外じゃ,まず効かない禁断の手法。
752751:03/10/14 09:11
きゃー,上で既出やった。
おわびに ISOの規格書コピペ。

Standard headers may be included in any order; each may
be included more than once in a given scope, with no effect
different from being included only once, except that the
effect of including <assert.h> depends on the definition of
NDEBUG.
753739:03/10/14 10:41
おー、ありがとう。
そうだったのか。
でも切り替えようとはおもわないな。
754Cを始めようと思うんですが。。:03/10/14 12:47
>>"Borland C++ Compiler 5.5.1"と"CPad"について。
Windows XP(Home Edition SP1)の上できちんと動いてくれるでしょうか?
両方とも動作対象にXPが入ってないのですが。。
どなたかご教授願います!質問厨でスマソ。。
755749:03/10/14 17:40
>>750
ありがとうございます。

これをやりたい理由は、ゲームエミュレータの
逆アセンブル機能で解析した特定のアドレスを
常に表示するプログラムを作りたいわけなんですが、
今、やってみたら、ゲームの逆アセンブル機能でみた結果が
5Eで、Cプログラムの方は、33728329と全然違う結果が出てきたのですが
逆アセンブル機能でみたメモリアドレスと、Cで指定した
メモリアドレスは全然違う場所を見ているということでしょうか?
> これをやりたい理由は、ゲームエミュレータの
> 逆アセンブル機能で解析した特定のアドレスを
> 常に表示するプログラムを作りたいわけなんですが、
お前にはあと3年は勉強しないと作れない(w
757749:03/10/14 17:57
>>756
なんか作ってみたいなと思っただけだから、
別に難しいなら、別のことをやるからいいですけど、
具体的に何が足りないのかを教えていただけませんか?
>>757
仮想アドレスとかエミュレータのメモリマップ機能とか
>>757
まずエミュレータとは何なのか調べてみな。
いまいちよく分からないんだけど、エミュレータ内でのアドレスと実際のコンピュータのアドレスを混同しているのかな?
761749:03/10/14 20:01
>>758
多分そうだとは思ってたんですが、仮想アドレスなわけですか。
>>759
はい。
>>760
そうだと思います。

とりあえず、皆様レスありがとうございました。
メモリビューワーとか色々なのがあったので、
自分でカスタマイズしたものも作れるかなとも
思ったんですが、認識が甘かったみたいです。
出直してきます。。
>>749
MMUの重要キーワードを列挙できるかどうか
756に聞いてみ
>>762
おれは749じゃないし、MMUって何?といった程度の者だが、
それを756に聞いたところで、749がやりたいことを出来るようになるわけじゃないだろ?
764gcc:03/10/15 05:43
文字列操作について教えて下さい。

文字数不明のchar型変数の最初の一文字を削る方法を教えて下さい。

例:
text = "..ABCD";
/* 最初の一文字を削る処理を */
printf ("Result:%s \n",text);

出力結果:.ABCD


この様な処理を行いたいと思っています。
宜しくお願いします。
text++;
printf ("Result:%s \n",text+1);
767デフォルトの名無しさん:03/10/15 08:08
次の問題を教えてください。

キーボードから英小文字を一つ入力して、大文字に変換して表示する。
なお、入力に間違いは無いものとする。

[実行結果]
英小文字を入力して下さい:h
入力した英小文字は"h"で、大文字にすると"H"です。


[ここまでは自分で考えた]
#include <stdio.h>
main()
{
char a;

printf ("英小文字を入力してください:");
scanf ("%c",&a);
printf ("入力した英小文字は"%c"で、大文字にすると"%c"です。\n",&a, &a-32);
}
768デフォルトの名無しさん:03/10/15 08:13
>>767
#include <stdio.h>
#include <ctype.h>
int main()
{
int a;

printf ("英小文字を入力してください:");
a=getchar();
print ("入力した英小文字は"%c"で、大文字にすると"%c"です。\n",a, tolower(a));
return 0;
}
769訂正 つーか宿題は(ry:03/10/15 08:14
>>767
#include <stdio.h>
#include <ctype.h>
int main()
{
int a;

printf ("英小文字を入力してください:");
a=getchar();
print ("入力した英小文字は\"%c\"で、大文字にすると\"%c\"です。\n",a, tolower(a));
return 0;
}
770訂正 つーか宿題は(ry:03/10/15 08:15
tolowerじゃなくてtoupper・・・
771767:03/10/15 08:20
出来なくないですか?
773767:03/10/15 08:23
>>772
#include <stdio.h>
#include <ctype.h>
int main()
{
int a;

printf ("英小文字を入力してください:");
a=getchar();
print ("入力した英小文字は\"%c\"で、大文字にすると\"%c\"です。\n",a, toupper(a));
return 0;
}

って事ですよねぇ?
んー・・・。
774767:03/10/15 08:24
あ、二つ目のprintfか。
出来ました。ありがとうございます。
・・・・・。
書き間違えたのあんただよ・・・・。>>768
>>765-766
「削ってない」じゃん。
>>776
strcpy(text, text + 1);
>>777
strcpyにmemmoveのような保証はあるのか?
>>776
いいじゃん別にぃ

>>777-778
重なるからmemmoveだね。
memmove(text,text+1,strlen(text));
>>776
規格では文字列リテラルの変更は未定義だボケ
本当だ。定数じゃねーかあれ。
>>780
それを突っ込む前に

 char 型変数に文字列は入らない



という事を>>764に突っ込むべきじゃないか?
783デフォルトの名無しさん:03/10/15 11:37
あるchar型の変数の値が "123\0・・・" として
この変数の値が数値として置き換えることが出来るかを
判定したいのですが、どのように判定するのがスマートですか?
よろしくお願いします。
"123\0・・・" → ○
"ABC\0・・・" → ×
>>783
char 型の変数に文字列は入らない。
785デフォルトの名無しさん:03/10/15 11:50
>>783
char *buf="123\0・・・";
int n;
if(sscanf(buf,"%d",&n)==1)
printf("できるみたい\n");
else
printf("できないみたい\n");

文字列全てを数値にできるかどうか判断するならかわりにstrtolを
isdigitで一文字目or全部の文字を判定
787デフォルトの名無しさん:03/10/15 13:25
>>786
それだけだと"-123"をうまく判定できない。
じゃあ0文字目がーかどうかを見ればいいだけのことだろ。
あとは\0までisdigit()が偽を返さなければ変換可能。
789デフォルトの名無しさん:03/10/15 17:10
む、整数とは言ってないな。すると小数点も必要だ。
さらに浮動小数の形式も認めないとも書いてないな。
10進数とも書いてないぞ。さらに複素数かもしれない。
漢数字も可だったりするかも。
a = strlen(buf);
for(i = 0;i < a;i++)
{
if(buf[i] >= '0' && buf[i] <= '9'){
f = 1;
}

}

if(f = 0){
できる
}
else{
できない
}
なんというか、ツッコミ所満載すぎ
792デフォルトの名無しさん:03/10/15 17:26
783です。
皆さんありがとうございます。
やはりstrtod()で判定するのがスマートそうですね
793デフォルトの名無しさん:03/10/15 18:26
#include <stdio.h>と#include <ctype.h>はどういう意味ですか?
>>793
>#include <stdio.h>

stdio.h をインクルードする。

>#include <ctype.h>

ctype.h をインクルードする。
795デフォルトの名無しさん:03/10/15 19:50
>>794
ありがとうございます!!勉強なります!!
>>791
禿同
漏れ的には
いちばん痛いのはaだ
そうか ?
俺的には、f が一番痛いが...。
>>788
そんなことするくらいなら既存の関数を使った方がいいだろ。
>>798
禿同
>>796-797
個人的にはわざわざ「strlen()」を呼んでいる辺りかな。(w











まあ、それ以前の問題でもあるんだが。
俺は>>797にワラタ
書いた人ゴメソ
書いた人=>>790ってことです
できないって言いたいんだろ
804デフォルトの名無しさん:03/10/16 00:05
790じゃないが、みんな一度はやったことあるだろ?(笑)
あるある
だから
if(0==f)
って書くようにしてるって発言したら
すっげーたたかれたこともある
>>805
それでは三田某に成り下がってしまう。
昔は 0==f って書いてたけど
一瞬よくわからないときがあるし
最近じゃコンパイラが警告してくれるから
どうでもいいと思ってる
if( f = hoge() ) {
って書きたいし
>>805
マジレスすると、いまどきのコンパイラなら、
if (f=0)
で、warning出してくれる。
つうか、warning出すコンパイラ使え。そしてwarningを無視するな。
>>806
三田先生クラスなら、
if (NULL == (fp = fopen(...))
ぐらいは書いてくれないと。
810デフォルトの名無しさん:03/10/16 01:23
>>809
')'が足りないぞ。
NULLがfpでfopenなのです。
812デフォルトの名無しさん:03/10/16 01:41
>>811
(゚Д゚)ハァ?
813デフォルトの名無しさん:03/10/16 02:26
なんか暫く来ないうちに凄いことになってますな・・・
warningが一つでもあると落ち着かない。
815デフォルトの名無しさん:03/10/16 14:36
今までプログラムの経験はないのですが、これからC言語を始めようと思っています。
>>1にある、
「プログラミング言語C(通称 K&R)」
という本は初心者が買っても大丈夫なんでしょうか?
もし、初心者向けじゃないなら他におすすめの本はありますか?
>>815

推薦図書/必読書のためのスレッド PART 12
http://pc2.2ch.net/test/read.cgi/tech/1060693125/

このスレの1に、過去ログや他の板などで紹介された本が
まとめられているサイトが3つあげられています。
それらのサイトを見てCの初心者向けとして紹介されてる
本がよいと思います。
>>814
コンパイラ書いたり、警告出すプログラムがかけないじゃないか。
>>815
少なくとも自ら「初心者」の称号に甘えてる奴に向くはずがない本だ
819デフォルトの名無しさん:03/10/17 01:13
設定ファイルから設定を読み込むプログラムは、どのようにすればよいでしょうか?

−−−−設定ファイルの中身−−−−
server[TAB]www.2ch.net\n
USERNAME[TAB]名無しさん\n
E-MAIL[TAB]\n
BODY[TAB]本文
−−−−−−−−−−−−−−−
項目[TAB]設定値

例えば、上記の様な設定ファイルからそれぞれの値を読み出して変数に
代入するようなプログラムを組もうと思っています。

perlの様にsplit関数があれば一行ずつ読み込んで「項目」別にswitchすればいい
と思うのですが・・・。
>>819
ttp://www.hcn.zaq.ne.jp/no-ji/tool/tool.htm
のページの一番下にある拡張 ini ファイル
をダウンロードして使ってみたら?

Windowsのiniファイル互換フォーマット
Windows以外のプラットフォームでも利用可
CとC++両方のI/Fが準備されている
821819:03/10/17 02:48
>>820

早速のレスありがとう御座います。
開発環境がLinuxなので、libファイルをソースからコンパイルすれば使える・・・かな?

これしか方法無いですかねぇ〜。

ちなみに、文字の結合はsprintfで出来ますが、分離はC言語では出来ないのでしょうか?
822デフォルトの名無しさん:03/10/17 04:37
そろそろさぁ、みんな気づいてると思うんだけど、
「C言語で移植性のあるプログラミング何て不可能なんだよ。」

Linuxを見てみろ、FreeBSDを見てみろ、GCCのバージョン上がった
だけで、右往左往じゃんか。

X11とか、ソース読みにくい以前に何をどうやってコンパイルしてるかだけで、
大騒ぎじゃん。やってられないッスよ。


だからね、俺思うに、イフデフラッピングとか、メイクでうんチャラとか
そーゆうのあきらめようよ。そーゆうのはソースコードに書くことじゃないんだよ。
CVSとかソース管理ツールでやる事なんだよ。

って事で、移植性を考慮したプログラミングは必要だが、移植性をソースコードに
持ち込むな移植性の為にソースを弄るなって言いたいのね。

みんあぁああ、どう思う?
823デフォルトの名無しさん:03/10/17 04:39
plan9
>>824
馬鹿?
826デフォルトの名無しさん:03/10/17 07:14
すいません教えてください
char* cs="abcde";

string型に変えたいのですが
どうすればいいのでしょうか?
>>826
その、string型ってのが何か書いてもらえると答えやすいと思います。
マイクロ祖父のSDK?それともMFC?それともSTL?
>>826
string型とは何ぞや。
よもやC++の話ではあるまいな。
>>827
釣られる前に気づけ。

>>821
いろいろあるぞ。
sscanf()でもstrtok()でも分割できるし、strchr()使って自前で分割するのも手だ。
#詳細は自分で研究しよう。
>>827、826
すいません、
自分でも知らずに操作していたのですが
どうやらstringはSTLのやつらしいです
しかも、そうなるとC言語ではないですね すいませんスレ違い。

stringがSTLの一部であることさえさっき知りました
で、
string str="...";
printf("%s \n",str);
で表示しようとしてもエラーになるので
(std:coutは出きるが。。)
char*に変えようかと思っていたわけです

実は、日本語を含む文字列のstrtok関数が上手く動かないので
自分で作ろうと思ってハマッています

で、最初普通にやっていたのですが
例えば「表」の文字は 95と5cに取り出せたのですが
これをあわせて
unsigned char c=0x959c
として表示させようとすると
printf("%C",c);
上が削られて
「\」が表示されます
なんでなんですか?

Windows2000 VC++6.0

>>829
C言語以前の問題だな。
まずは文字コードから勉強汁。
831デフォルトの名無しさん:03/10/17 13:36
すいません教えてください
charの二次元配列を関数から返したいのですが
宣言とかはどのように書けばいいのでしょうか
やりたいことは↓のような事なのですが

char[][] get(){
//
char c[2][3];
//
return c;
}

char[][]はC言語では無理みたいなので
↓のように書きましたが、「char[][] はchar**に変換できません」と、エラーになります
char** get(){
//
char c[2][3];
//
return c;
}

どうすればいいんでしょうか?

>>831
ローカル変数を戻り値で返そうとするな!
struct hage {
 char c[2][3];
};

struct hage foo(void) {
 struct hage hoge;
 return hoge;
}
834832:03/10/17 13:43
>>832
×ローカル変数を
○ローカル変数のアドレスを

逝ってきます…
>>831
typedef (*type)[3];
type get();
こうかな。

>>834
×ローカル変数のアドレスを
○自動変数のアドレスを
836835:03/10/17 14:02
typedef (*type)[3]; じゃなくて typedef char (*type)[3];
837835:03/10/17 14:05
typedefしない場合はこうか。
char (*get())[3];
838831:03/10/17 14:10
>>831
ローカル変数を戻り値で返そうとするな!

やっぱりそうですか
昨日からずっとポインタとかで悩んで
今だに理解できてないな俺は・・・
エラーがでなくなったらとりあえずOKみたいな感じで
やってますが
Javaのやり方に染まってしまったみたいなので
どうも、よく理解できん
いや、ポインタはわかるんだが使う場面がわからん

こういう場合はそのまま値返した方がいいんですか?
return JAVA;
>>838
妙なプライド捨てて入門書読むのがいいと思うけど。
C++ -> Java ならともかく、逆方向は結構あれこれ知るべきことがあるよ。
stl 以外にも便利なライブラリもあったりするしさ。
841840:03/10/17 14:19
スマソ。。。Cスレだった。。
842831:03/10/17 14:23
>>838
妙なプライド捨てて

↑そうですね、これは言えてますね
マジレスして無視されるのってむなしいね(^o^;)
質問者の多くは入門書すら読んでないという悲しい現実。
845初心者X:03/10/17 19:14
以下の2次元配列の合計と平均を計算して表示する
プログラムってなんですか?

int a[3][5] =
{
{7,2,3,8,8},
{1,9,4,5,3},
{4,3,8,3,6},
}
;
846初心者X:03/10/17 19:15
以下の2次元配列の合計と平均を計算して表示する
プログラムってなんですか?

int a[3][5] =
{
{7,2,3,8,8},
{1,9,4,5,3},
{4,3,8,3,6},
};
>>845-846
マルチはやめれ
int total = 7+2+3+8+8+1+9+4+5+3+4+3+8+3+6;
int avg = total / 15;
fprintf(stderr, "%d %d\n", total, avg);
>>848
avgはdouble型にしろYO!
>>849
ネタにマジレスですまんが、なぜ?
特に仕様として指定されていないわけで、
元データがintなのだから、結果もintであるべき。
結果をdoubleで欲しいなら、必要なくとも元データもdoubleであるべき。
仕様? 2次元配列の合計と平均を計算していないくせに何言っているんだ。
>>850
1 と 2 の平均は 1 か?
>>850
つかネタはお前だろ。
>>852
1 と 1 と 2 の平均は?
>>852
許容誤差も定義せずに空想論ひけらかしてんじゃねえ
こういう奴いちばん邪魔
mallocを使用した動的割り当てができないのでどなたか知恵を貸していただけないでしょうか?
UNIXでC言語を使用しておりまして、
文字列のバッファサイズをコマンドラインの引数で指定するのですが、
文字列はmain関数だけでなく、同じプログラム上の別関数にも使用されるため、
グローバル宣言しています。
この際、どのようにすれば引数で文字列のサイズを変更できるのでしょうか?

どなたかよろしくお願いします。
>>856
あっちで誘導ついでに答えただろ
>>856
構造体
859857:03/10/17 22:21
まだ続いていたのか。
なんでエラーになるんだろう?配列じゃなくてmallocだろ?
size_t bufsize;

int main(int argc,char *argv[])
{
bufsize=strtoul(argv[1],NULL,10);

後は好きなところでbufsizeを使えばmallocできると思うんだけどな。
質問です。
文字列をアスキーコードに変換して、その数値で演算はできるんでしょうか?

例えば、「a」ならアスキーコードに変換すると「97」ですよね。
で、この数字に10を+して、107にしてから、今度は別の文字「k」に変換したいんですけど。
そういったプログラムを書くことは可能でしょうか?
お願いします。
>>860

ありがとうございます。
やってみます。
できる。
>>861
変換自体が不要
もっとプログラム以前の知識を身につけろよ
865ファイル:03/10/17 23:23
読み込みたいテキストファイルの前半にに不必要な部分があるのですが、
その部分を除いてそのテキストファイルを読み込むことはできますか?
c言語初心者です、どうすればできるか詳しめでお願いします。
ようやくここに着たか。
fseek使うか読み飛ばすかしとけ。
867ファイル:03/10/17 23:44
ようやく来た。なんかよくわからんけど
fseek使うか読み飛ばすかしとくわ。
どうもー
CmachineはCの勉強に案外役立っているんだがな。
まぁ使えないものもあるから、そこが問題と言えば問題だが。
でもすぐに実行できてかなり良い
869デフォルトの名無しさん:03/10/17 23:55
すいません教えてください
C言語では配列の容量をあらかじめ決めなければいけないみたいなのですが

d[30];//別の関数から受け取ったintの配列。途中からゴミが入っている可能性がある。
↑のようになっている場合
この配列に有効な値が入っている要素を
取り出して値を表示させたいのですが
どうすればいいのでしょうか?

またコレがchar*の配列だった場合
NULLで条件指定しても初期化で'\0'をしてないので
NULLでは判別できません
こういうばあい、配列をつくったときに
'\0'で初期化するのがC言語のやり方なのでしょうか?
(intの場合だと、自分で無効な値をあらかじめ定義して(例えば-100とかで)初期化するとか?)
本当に
for(int i=0;i<size;i++)
c[0]='\0';

とかいうやり方でやるのでしょうか?
この辺りの作法を教えてください
870デフォルトの名無しさん:03/10/17 23:56
C Machineのサイト閉鎖しちゃった・・・・
>>1の内容のせいかなぁ。一度作者が降臨したし。
for(i=0;i<30000;i++){
 for(j=0;j<30000;j++){
  for(k=0;k<30000;k++);
}}}
こんなふうに時間稼ぎすることってありまつか?
872デフォルトの名無しさん:03/10/18 00:01
>>869
> この配列に有効な値が入っている要素を
ゴミでないという意味なら、どこまで代入したか覚えておく。

> NULLで
NULLはポインタ。'\0'はナル文字とかヌル文字とか。書くときは'\0'でいいと思うよ。

> '\0'で初期化するのがC言語のやり方なのでしょうか?
> (intの場合だと、自分で無効な値をあらかじめ定義して(例えば-100とかで)初期化するとか?)
必要があれば。常にする人もいるみたいだけど。
>>869
>for(int i=0;i<size;i++)
>c[0]='\0';

宣言時に初期化汁。


[例]
char buf[30] = {'\0'};
>>871
環境によりけり。
コンパイラやCPUによっては全く意味なし。
875デフォルトの名無しさん:03/10/18 00:31
>>872、873
どうもありがとうございます
やはり初期化するのが当然みたいですね

また、配列をプログラム内で大きさ決めようと思って

int size=0;
while(){
//何かの数を数えてsize変数に代入
}
int d[size];

とやってんですが、『サイズが 0 の配列を割当てまたは宣言しようとしました。』
などとでてきます。
こういうことはCでは無理なのですか?

int size=100;
int d[size];
などとしても無理みたいです。
これがC言語の常識だとすると、かなりプログラミングの考え方が変わってきます
ホントにこういうやり方なのですか?
>>875
malloc関数で
877デフォルトの名無しさん:03/10/18 01:07
x = (a==b?c:d);
ってどういう意味なのでしょうか?
xはaがbならcさもなくばd
>875
C99準拠のコンパイラなら可能だったような
880デフォルトの名無しさん:03/10/18 01:20
>>870
まじ!?
せっかくこれからいいものになっていくと期待していたんだがな。
別にこれからゆっくりと機能増やして、ANSI Cに準拠すればよかったのに、
2chに名前を出すから、こうなるんだよな。
ふざけやがって
881デフォルトの名無しさん:03/10/18 01:22
>>870
あとどこで降臨したのか、覚えていたら教えてもらえると嬉しい。
C99見てこりゃ不可能だと悟ったに1票
884デフォルトの名無しさん:03/10/18 02:41
>>881
http://pc2.2ch.net/tech/kako/1058/10587/1058754682.html
ここの647から。

一応終了すると言っているね。
>>1に書いたのはC Machineでうまくゆかないという質問が何度かあったからだったかな。もう書かなくてもいいと思うけど。
>>880
何年間も放置されてて本人がやる気も失せてるのに期待するだけ無駄。
>>871
ホスト環境でやったらケリ入る

組み込みでタイミングつーと
アセンブラかハード使う

>>875
whileの後に定義は書けないよな
C99という可能性も最後で消えてるし
セマンティクス以前にシンタックスで落とされている

>サイズが 0 の配列を割当てまたは宣言しようとしました
というエラーメッセージにある0はコンパイラが適当こいてるだけ
別に文脈から0になると読んでいるわけではなく
単に定数式として評価したらエラーでその時点までの結果が0と
言っているだけで、はっきり言って何の手がかりにもなってない
887デフォルトの名無しさん:03/10/18 14:48
これからC言語とLinuxを勉強したいと思っている初心者なんですけど、
いきなりLinuxを使ってCを勉強するのは無謀ですか?
やっぱりはじめはwindowsでCを学んだほうがいいのでしょうか?
888kintyou:03/10/18 14:53
cでaaa.aaa.aaa.aaaからbbb.bbb.bbb.bbbに
デフォルトゲートウェイを変更のプログラムを組みたいのですが・・
systemでrouteを呼べばいいとアドバイスをいただいたのですが、
どのように書けばいいでしょうか?

>>887
むしろ逆じゃね?
>>888 マルチ氏ね
>>887
>やっぱりはじめはwindowsでCを学んだほうがいいのでしょうか?
なぜ、そう思うんだ?
これに答えられるなら人に聞くこともあるまいが、
C入門という観点でLinuxとWindowsはどっちがいいかと聞きたいのか?
892887:03/10/18 15:50
Linuxとwindowsの違いがわからないくらい初心者なんです。
「Linuxでのプログラミングはwindowsとは違っている」
というようなことを本で読んだので、どっちで始めたら
いいのかなと思いまして。
初心者にはどちらがお勧めなのでしょうか?

Hello, Worldくらいのプログラムならどっちでも同じ
右クリックかmkdirか、というエンドユーザ方面の操作方法を
しっかりガイドしてもらいたければWindowsじゃないか?
>>892
プログラミングとかは関係なく、お前みたいな初心者は Linux 使うな。
つーか887が今パピコするのに使ってるマシンでいいやん
charの読みは「ちゃー」でOKですか?
>>896
>>1を読め。
C99で新しく加わった機能を使って実務している人、いる?
C99使うならC++をbetterCとして使えよ、って俺は思う。
うーん、C++までいっちゃうとそれはそれでまた表現が柔軟すぎるからなぁ。
>>896
OK
>>900
>>899の意味がわかりますか?
>>902
>>900の意味わかってますか?
>>892
OSの導入から始めなければならないなら
導入したことのないOSは避けろ
プログラミング以前でつまずく

すでにLinuxが使える環境にいてある程度コマンドが使えるなら
Linuxがいいと思う
>>898
C99なんか使うのはCマガの読者くらい。
>>904
ある程度Linuxが使えるならLinuxでC言語を勉強したほうが簡単?
>>906
もち

904も言ってるが
>プログラミング以前でつまずく
まず、これを避けねばならん
Linuxの前にEmacsかViの操作を覚えるのがめんどいと思う。。。
それならgEditで
Linuxが使えることとviが使えることはイコールじゃなくなってきてるのか。。。
あ、漏れvi使えるし普段はmuleやxyzzy使ってるけどLinux触ったことないよ。
へいへい悪うござんした
>>910
Linux 以外にも UNIX 互換 OS はあるし、
最近は emacs に人取られて vi 信者は減る一方だろ。
914デフォルトの名無しさん:03/10/18 22:53
scanf("%d",&i);/*分岐の選択*/
while(i != 1 && i != 2)
{
printf("%s\n1か2を入力して下さい\n%s\n",o,o);
scanf("%d",&i);/*再入力命令*/
}
if(i==1)/*分岐1-1*/ ・・・

超初心者です。上のような文だとアルファベットを入力したとき
バグりますよね?また、1,2以外の数字を打った後1,2を再入力しても
受け付けてくれないので困ってます。何かいい関数や文はないでしょうか?
誰か教えて下さい。
文字列で読み取ってsscanf
>>914
とにかく、scanf() は使うな。
挙動を理解するだけでも大変だし、どうせまともなアプリにはほとんど使えない。

>>915 の言うように、fgets() とかで (文字列として) 読み込んで、sscanf() 使うのがいいかと。
917914:03/10/18 23:14
試してみます。ありがとう。
C99で魅力的だと思うのはビット数の決まった型があることくらいかな・・・
>>916
fgetsじゃ隣のパケットを検出したときungetcしてくれんだろ
>>883-885
誠にありがとうございました。
どうも俺が突っ走っていたようですね。すんません。
俺も学生ですが、これは使いやすいんですよね。
一回一回プロンプト開いたり、コンパイルに時間がかかるよりも早く結果が見れますから。
かなり重宝しているものです。
まぁ開発者が投げ出したのなら仕方が無いけど。
922914:03/10/19 00:20
#include<stdio.h> #include<string.h>
char k =[50]; .................  
......... FILE *fp;
fp = fopen("file1.txt","r");
fgets(k,49,fp);
sscanf(k,"%s",&i);  /*分岐の選択*/
  if(k='1')    /*分岐1-1*/ .......
........... fclose(fp);
これでfile1.txtを用意して1行目に12を用意しました。
コンパイラを通すと'fp' undefinedと|-value requiredがでました。
どこが悪いのでしょうか?
>>916
>挙動を理解するだけでも大変だし、どうせまともなアプリにはほとんど使えない。
それは、おまえがだろ?
恥ずかしげもなく露骨な論点先取をしてのける者に相応しい能力だな(プ
>>919
どういうこと ?

>>922
きちんとソースを掲載しないあんたが悪い。
ほんとに一行に #include<stdio.h> #include<string.h> と書いてるわけじゃないだろ ?

>>923
下らん煽りありがとう。
まあ、せいぜい scanf() の挙動でも語っててくださいな。
どうせそれぐらいしか自慢できないんだろ ? (プゲラ
scanfはいけません。fscanfの第一引数にstdinを指定して使いましょう。
C言語を学び始めたばかりなのですが…

#include <stdio.h>

int i;

int main (void)
{
do
{
printf ("1から3の数値を入力してください:");
scanf ("%d", &i);
}
while (i < 1 || i > 3);

return 0;
}

で、数値以外のものを入力すると無限ループになってしまうのですが、どうしたら回避できるのでしょうか。
教えてください。
うお、すぐ上に出たばかりだった…
すみません(鬱)
>>925
いやネタでもそういうことは言わない方がいいぞ
>>928
まずかった?
>>924
>どうせそれぐらいしか自慢できないんだろ ? (プゲラ

>挙動を理解するだけでも大変だし、どうせまともなアプリにはほとんど使えない。

少なくともこの点に自慢されうる隙があったことを自ら認めたわけだな


>きちんとソースを掲載しないあんたが悪い。

この言葉をあんたにそのまま返してやろう
scanfだけで次元の低い争いが見られるスレはここですか?
そもそも C 自体次元が低い
それは低水準言語って意味?
すごいな。scanfで自慢大会
935デフォルトの名無しさん:03/10/19 08:52
ちょっと基本的な質問なんですが

int* x[4];
↑この配列のサイズを知りたいとき(4という数字が欲しい)
そういう関数はありますか?
入門書見るとたとえば
for(int i=0;i<4;i++)
などとやっていて、「4」という数字を覚えておかなければならないような
書きかたしてるので、納得いかないのです
同じ関数内ならいいのですが、
他の関数に渡ったときこの「4」という数字は渡せず、
先に「4」を決め打ちして関数作ると他の大きさの時使えない関数になる
おそらく
function(int** z);
という具合にポインタのポインタで渡すことしか出来ません

一応自分で、
sizeof(x)/sizeof(*x)
とかいうやり方しか思い浮かばなかったのですが
そういう関数があれば教えて欲しいのですが・・・
936935:03/10/19 08:54
すいません
int* x[4];
ではなく
char* x[4];
です。
>>935
関数じゃどうやったって無理。

> 他の関数に渡ったときこの「4」という数字は渡せず、
渡せばいいだろ。いくつかの標準関数を見てみれば分かるが、配列の大きさは引数として渡す。
938935:03/10/19 09:39
>>937

レスありがとうございます
>渡せばいいだろ。いくつかの標準関数を見てみれば分かるが、配列の大きさは引数として渡す。
それがC言語のやり方ならそうします
int size=sizeof(x)/sizeof(*x);は、まずいですかね?
939937:03/10/19 09:46
>>938
ひとつ聞きたいんだが、xは配列じゃなくて引数として渡されたポインタだよな?
もしも
char *x[4];
int size=sizeof(x)/sizeof(*x);
とやっているのならそれでいいんだけど。
940937:03/10/19 09:49
void func(char **x)
{
int size=sizeof(x)/sizeof(*x);
}

int main()
{
char *x[4];
func(x);
return 0;
}

これではダメだってこと。
>>930
> 少なくともこの点に自慢されうる隙があったことを自ら認めたわけだな

そうですが、それがどうかしましたか ?
scanf() マスターでも目指してがんばってね。(キャハハ

> この言葉をあんたにそのまま返してやろう

意味不明なんだけど、説明してくれる ?

>>939-940
それは、無理。
普通は、#define array_size(x) (sizeof(x)/sizeof(x[0])) みたいなマクロにする。
942937:03/10/19 10:03
>>941
俺は分かっているって(^_^;)
>>942
sizeof(x)/sizeof(*x)

sizeof(x)/sizeof(x[0])
944937:03/10/19 11:10
>>943
普通はsizeof(x[0])にするが、sizeof(*x)でも間違いではないだろ。
945デフォルトの名無しさん:03/10/19 11:18

質問があります

char* c1="abcdefg";
char* c2="xyz";
strcpy(c1,c2);//←これはダメ.実行時エラー

char c3[10];
strcpy(c3,c2);//←これはOK

//なぜなんでしょうか?
//もし、一番上のがえらーになるのなら
printf("%s",c1);
//↑これもエラーになってもいいような気がするんですが・・・

文字列リテラルが書き換え可能かどうかは、
じゃあ例えば

char c3[]="abcdefg";
strcpy(c3,c2);

これはOK

なんで?
>>947
なんでって、配列だからだろ。つりか?
949947:03/10/19 11:55
いえ
>文字列リテラルが書き換え可能かどうかは

に対する質問です
なぜ、
char c3[]="abcdefg";
char c3[30];

がOKで、

char* c3="abcdefg";
がダメなのか、さっぱりわかりません
>>949
char c3[]="abcdefg";はchar c3[]={'a','b',・・・'g','\0'};と同じ
char c3[]="abcdefg"; は sizeof("abcdefg") のサイズの領域が確保される
char c3[30] は sizeof(char) * 30 のサイズの領域が確保される (sizeof(char) == 1 と定義されているが一応)

char* c3="abcdefg"; は sizeof(char *) のサイズの領域が確保され,"abcdefg" を参照するのみ
"abcdefg" の領域はユーザーの手元にはない
947の勘違いは
配列とポインタの違いの理解不足>>951
より
char配列初期化の省略形に対する理解不足>>950
が原因と見た。

まあ、配列とポインタがわかってない可能性も大だが。
おまいら親切だな
954947:03/10/19 12:10
>>950‐951
すいませんでした
どうもありがとうございます
955947:03/10/19 12:21
>>952
いえ、950の話はわかっていたのですが
951のようなことは知りませんでした

>まあ、配列とポインタがわかってない可能性も大だが。
char d[10];//あるいはd[]="abcd";
char* x=d;
という具合に初期化できることと
char* x="abc";
と書けることが、混乱したのかもしれません

char* x="abc";と書くことによって同じように操作(r、w)出来ると思ってました

でも、ポインタがわかっているのなら
書き込めてもよさそうなものだと思っていました

>>945
「文字列定数」という言葉が指し示すとおり、文字列定数は"変数"ではなく"定数"である。
>>945が疑問に思っているのは、どうせ同じ "メモリ" に記憶されているのだから、
書き換えさせてくれたっていいじゃん、ということだろう。

これに対する回答はいろいろあるだろうが、一番理解しやすい理由としては、
Cの規格は、定数を "RAM" ではなく "ROM" に書き込む処理系も
考慮しているから、という回答だけで十分だろう。

例)ROM への書き込み->NG
strcpy(c1,c2);//←これはダメ.実行時エラー

例)ROM からの読み込み->OK
printf("%s",c1);
//↑これもエラーになってもいいような気がするんですが・・・
>>956
簡単なことを偉そうな口調で説明するなよ、ヴォケ
958947:03/10/19 12:48
>>956
丁寧な回答ありがとうございます
その他の人も

読み込みOKで書き込みNGっていうことがあるのは今回はじめて知りました

まさに
>どうせ同じ "メモリ" に記憶されているのだから、
書き換えさせてくれたっていいじゃん、ということだろう。

こういうことを当然のように思っていました。
何のためのポインツなのかと疑問に思っていました
>>956
ANSI/ISO C に「文字列定数」などという言葉は出てこないわけだが。
>>959
英語だからでしょ?
リテラルと定数は違うってことだろ
963デフォルトの名無しさん:03/10/19 13:27
配列の配列をmallocするにはどうすればいいですか?

char* c=(char*)malloc(sizeof(char)*10);
char** cc=(char*)malloc(sizeof(c)*15);
こういう感じでいいですかね?
>>963
モレいつもこうやってる。
 int i, result = FAILURE;
 char **cc = (char **)malloc(sizeof(char *) * 10);
 if (!cc) goto finally__;
 for (i=0; i<10; ++i) {
  cc[i] = (char *)malloc(15);
  if (!cc[i]) goto finally__;
 }
 /*
  * cc[0][0] 〜 cc[9][14] まで使用可能
  */
 result = SUCCESS;
finally__:
 if (cc) for (i=0; i<10; ++i) free(cc[i]);
 free(cc);
 return result;
}
>962
俺はむしろ
「C言語+文字列定数」の検索結果が
「C言語+文字列リテラル」の検索結果と比べて
わずか100件しか多くないことに驚いたよ。
「定数」と「リテラル」の一般的な使用頻度をかんがえるとね。
なんかさ、くどいね
>1を読め、で終わりそうな話題が多いでつね
>>964
欠陥ありだな。
969964:03/10/19 14:03
>>968
まじ? 途中でメモリ割り当てに失敗しても,きちんと解h

あ!

ゼロクリアしてないとまずいね…
会社のソース,明日早速修正しなきゃ…
>>969
次からは calloc() を使用汁
> 会社のソース
(((ガクガクブルブル)))
>>970
欠陥ありだな。
どうか、我々が>>694の会社の製品を使っていませんように…
974973:03/10/19 14:12
>>973
×694
○964
>>973
どうか、我々がおっちょこちょいな>>973たんの会社の製品を使っていませんように…
976964:03/10/19 14:21
>>973
大丈夫 (;´Д`) 2年も "プロのプログラマ" やってて,
まともなプログラミングの仕事はこれがはじめてだから
>>976
964を騙るな

それにしてもイタ杉
>>964
次からは malloc の呼び出しは1回だけで済ませるようなコードに修正しておけ。
メモリの分断も防げるし、エラー処理も簡単になるし、実行速度も上がる。
979デフォルトの名無しさん:03/10/19 14:51
Cで3次元配列のメモリを確保するにはどうしたらいいですか?
そうですかそうですか。
>>964
このプログラムって
#define NULL 0

が前提で作っているんだよね?

#define NULL ((void *) 0)

な処理系で動くのかな?
>>979
まず、あなたの2次元配列を確保するソースコードを見せてください。
>>981 CFAQ嫁
>>981
>このプログラムって
>#define NULL 0
>が前提で作っているんだよね?

何を勘違いされているのでしょうか?
>>984
もうこのネタ面倒くさいだけだから刺激しないでくらはい
986979:03/10/19 15:00
>982
matrix=(double**)malloc(sizeof(double*)*x);
for(i=0;i<=x;i++){
matrix[i]=(double*)malloc(sizeof(double)*y);
}
987筆跡鑑定人:03/10/19 15:04
>>977
以下の観察事項より、>>969>>976 は同一人物だと推測されます。
1.文字と記号の間にスペース文字を入れている
2.読点に「,」を使用している
3.句点を使用していない
4.およそ60文字以内で改行を行っている
>>987
うほっ?そうなの?
>>986
matrix = (double**)malloc( sizeof(double) * x * y * z + sizeof(double*) * x * y + sizeof(double**) * x );
あとは中身を微調整
990979:03/10/19 15:12
>989
あり!
>>979
あなたの思想でいくとこんな感じになるのかなぁ。
エラーチェックは追加してね

double ***array3, **array2, *array1;
int counter1, counter2;

array3=(double***)malloc(sizeof(double**)*w);
for (i=0;i<w;++i)
array2=(double**)malloc(sizeof(double*)*x);
for (i=0;i<x;++i)
array1=(double*)malloc(sizeof(double)*y);

/*return(array1);*/
>>987
5.三点リーダー × 1 を使う
6.数字は半角

これを追加な

ちなみにこれは漏れの筆跡とも一致するわけだが…
>>991だが、途中で送ってしまった。すまん
994989:03/10/19 15:16
キャスト間違った
(double***) な
995989:03/10/19 15:18
利点はメモリ確保と解放が1度で済むこと
欠点は一見わかりにくいこと,アクセス違反しても検出されにくいこと
次スレはどこ?
>>995
ワロタ
998979:03/10/19 15:20
>991,994
あり
last1
うんこ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。