トップページ⇒tech
1001コメント273KB

C言語なら、俺に聞け! <27>

■ このスレッドは過去ログ倉庫に格納されています
0001日下部? ということにしたいのですね? :)NGNG
C言語質問スレッド Part 26

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
・comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART4
http://pc.2ch.net/test/read.cgi/tech/1022961238/l50

・前スレ

<26> http://pc3.2ch.net/test/read.cgi/tech/1026048820/
<25> http://pc.2ch.net/test/read.cgi/tech/1024918442/
<24> http://pc.2ch.net/test/read.cgi/tech/1024033400/
<23> http://pc.2ch.net/test/read.cgi/tech/1023024817/

コンパイラなどのリンクは>>2-3 あたり
void日下部氏の激動の半生は過去スレを参照
0237デフォルトの名無しさんNGNG
> static charfoo[1000] = "HOEHOE";
え、コンパイルエラーにならない?
0238デフォルトの名無しさんNGNG
charfoo
0239234NGNG
>>237
ならない。ワーニングになる。何故ならんのかわからんが。

>>236
だよな。一瞬俺の記憶が狂ってるのかと思ったのだよ
0240234NGNG
ついでにもひとつ質問


グローバル宣言で

extern int inted;
extern int wnted;
・
・
・
・
int inted;

と記述した場合、コンパイラはどう解釈するんだ?
これもエラーが出ないらしい。ワーニングさえ。問題ないってことか・・・?
0241234NGNG
↑は
 ・ppp.hというヘッダでextern宣言されている
 ・ppp.cで実体宣言されている
 ・ppp.cで最初にppp.hをインクルードしているため、展開後の解釈が↑のようになる

という意味です。
0242デフォルトの名無しさんNGNG
コンパイラを手に入れたいのですが
ここ→http://gcc.gnu.org/からどうやって手に入れるのか
英語ちゃんができなくて分かりません
どうか教えて下さい
0243デフォルトの名無しさんNGNG
>>240
特に問題はないと思うが?
もしかしてwntedが宣言だけされていて定義されていないことか?

wntedがプログラム中に使用されていなければ、エラーにはならない。
使用されていればエラーになる。
0244デフォルトの名無しさんNGNG
>英語ちゃんができなくて分かりません
英語の前に日本語を勉強しろ。
あと、英語がわからないなら、日本製だけ使っとけ。
0245デフォルトの名無しさんNGNG
>>242
少なくともOSくらいは書こうよ。
0246242NGNG
すいません
OSはwindows98SEを使ってます
それと英語ができなくてもつかえる日本製というのがあれば
教えていただけますか
0247としNGNG
しぬ?
0248デフォルトの名無しさんNGNG
>>246
コンピュータ英語出来ないのはプログラマとして致命的。

ああ、日本語LOGOとかめじろとかは国産だ。
0249デフォルトの名無しさんNGNG
>>246
Borland C++でも使え。入手方法からインストール方法まで書かれている。
http://homepage1.nifty.com/tyuuki/old/cc/bcc_install.html

gccの場合、コンパイルエラーなどのエラーメッセージは全て英語だ。
英語ができない奴に使いこなすことは難しいだろう。
0250デフォルトの名無しさんNGNG
>>249
> gccの場合、コンパイルエラーなどのエラーメッセージは全て英語だ。

いつの時代の話だ?gcc 3.1 は日本語がうざすぎるくらいだが。
0251デフォルトの名無しさんNGNG
>>237
なる。型名もしくは配列名が指定されていない。
0252デフォルトの名無しさんNGNG
俺の使っている2.9xは英語だが。
0253デフォルトの名無しさんNGNG
>>250
> いつの時代の話だ?
では、Cで可変長配列が使えないことも「いつの時代の話だ?」
と煽っていいんですね?
0254デフォルトの名無しさんNGNG
>>253
語尾に:)がついていない。8点減点。
0255240-241NGNG
>>243
ん、問題なかったっけ。さんくす。
問題定義しているのは、

・externで外部参照宣言した後に、実体を宣言しても問題ないのか

ということね
0256デフォルトの名無しさんNGNG
>>255
外部参照宣言はどこかのファイルに存在するものを参照する。そのどこかには自らのファイルも含まれる。
0257256NGNG
s/参照する/参照することを宣言する/
0258デフォルトの名無しさんNGNG
>>253
でもそれってブロックの最初でしか・・・。
0259デフォルトの名無しさんNGNG
>>234
> static charfoo[1000] = "HOEHOE";

コンパイルしたら、エラーになったよ。

a.c:3: invalid initializer

まぁこれはミスなんだろうが…

実は更にc.cというファイルがあって、そこに実体があるという罠。
それでもwarningがでるのはおかしいけど…
これ以上はwarningを貼ってもらうしかないね。
0260242NGNG
>>249
ありがとうございます
チャレンジしてみます
0261デフォルトの名無しさんNGNG
くだらないことですいません。C言語っていくらですか?
0262デフォルトの名無しさんNGNG
>>261
\0,000-
0263デフォルトの名無しさんNGNG
>>261
社会・世評
http://natto.2ch.net/soc/

が詳しい。
0264デフォルトの名無しさんNGNG
>>261 void流煽り
> C言語っていくらですか?

いいえ、いくらではありません。:)
0265デフォルトの名無しさんNGNG
>>259
恐ろしいことに、昔のCとの互換性のために「型を省略したらint」が
適用されてしまって、static charfoo は static int charfoo と同じ
意味になってしまう。

invalid initializerになるのは、型が書いてないからじゃなくて、
intの変数を文字列で初期化しようとしたから。だから、
static charfoo[1000];
これはエラーにならなかったりする(warningくらいは出るが)。
もっと極端な話、
foo;
これだけでもint foo;と解釈されてエラーにならないんだよね。
0266251NGNG
>>265
ああそうだった。longがlong intと見なされると同じだね。
0267デフォルトの名無しさんNGNG
foo;
これだけでもint foo;と解釈されてエラーにならないんだよね。

これはウソ
0268デフォルトの名無しさんNGNG
>>267
gccではエラーにならないんだけど、コンパイラによるのかも。
0269デフォルトの名無しさんNGNG
const/static等を付けた場合のみ暗黙でintになるんじゃないの?
gcc2.9.4/gcc3.1/vc6/bcc5.5.1で通らなかったよ
0270デフォルトの名無しさんNGNG
関数の中だと式文と解釈されてしまってだめだね。
関数の外なら行けますた。

% cc -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/specs
gcc version 2.95.3 20010315 (release)
% cat foo.c
foo;
% cc -c foo.c
foo.c:1: warning: data definition has no type or storage class
% nm foo.o
00000004 C foo
00000000 t gcc2_compiled.
%
0271タイピング初心者NGNG
Cでタイピングソフトを作ろうと思うんですけど、
どっかにお手本になるソースファイルはありませんか?
いろいろ探したんですけど、なかなか見つからなくて・・・
0272デフォルトの名無しさんNGNG
それくらい考えてみろよ
0273デフォルトの名無しさんNGNG
>>271
考える力のないものは再開発しかできないのか?
0274デフォルトの名無しさんNGNG
>>271
どんな環境でも使えるものを作るのは、Cだけでは大変だよ。
0275デフォルトの名無しさんNGNG
>>274
標準入出力が使えればそれが使える環境ではまぁ使えるか。
0276デフォルトの名無しさんNGNG
>>275
リターンキー押すまで入力されないタイピングソフトとかはつらかろう
0277デフォルトの名無しさんNGNG
>>276
一文字ずつ取得すればよかろう。
0278デフォルトの名無しさんNGNG
>>277
どうやって?
Cの標準関数ではできないよ。
0279デフォルトの名無しさんNGNG
んなもん
Java中間コードを出力するCコンパイラを作れば解決

Javaを使えというまっとうな意見は却下
0280デフォルトの名無しさんNGNG
>262
そうか?ANSIとかJISとか行って、
「Cの規格表ください」って言っても、
ロハではもらえないとおもうぞ。
0281デフォルトの名無しさんNGNG
C言語はロハ
規格書は有料
0282デフォルトの名無しさんNGNG
漏れも規格は有料だと思ってたけど、 JISは無料で閲覧できるように
なってるみたい。

http://www.jisc.go.jp/
ここからデータベース→JISとたどっていって規格番号を指定すれば、
PDFで見ることができる。ちなみにC言語はJIS X3010だ。
0283デフォルトの名無しさんNGNG
>>282
死ぬほど遅いんだけど...
PDFをダウンロードするのはマズイのかなぁ。
0284デフォルトの名無しさんNGNG
そうかな? サイトが重いとかそういうことはないみたいだけど。
ファイルはそれなりにでかいですよ。X3010は13MBくらい。
0285デフォルトの名無しさんNGNG
つまらんことなんだが、このスレ参考になるなぁ・・・と思ってる俺は知識不足?
0286デフォルトの名無しさんNGNG
>>284
ファイルgetした(w
やっちゃまずいんだろうけども、トラフィック浪費しちゃまずいと思ってさ。
0287専門学校1年生NGNG
10進→16進変換のプログラムなんですが、うまく結果が表示されません。
変な記号がまじります。
添削お願いできませんでしょうか。

#include<stdio.h>

void main()
{
char code[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

char hex[4];
int i,data;

for(i=0;i<4;i++)
hex[i]='0';
printf("データ入力:");
scanf("%d",&data);

for(i=0;data>=16;i++){
hex[i]=code[data%16];
data/=16;
}
hex[i]=data;
for(i=3;i>=0;i--)
printf("%c",hex[i]);
}
0288デフォルトの名無しさんNGNG
宿題?
0289デフォルトの名無しさんNGNG
>>287
俺は天才なので教える。

printf("%x",data);
0290デフォルトの名無しさんNGNG
>>287
後ろから4行目
> hex[i]=data;
hex[i]=code[data%16];
0291デフォルトの名無しさんNGNG
>>290
素敵
0292専門学校1年生NGNG
>>288
宿題です。

>>289
すみません。そこの部分はプリントではデフォルト部分で・・
出題部分ではないのでかえられませんのです。

>>290
出来ました!♪
ありがとうございました(涙)
また教えてくださいませ。

0293専門学校1年生NGNG
sage忘れすいません。
0294デフォルトの名無しさんNGNG
 
0295284NGNG
書いた後で思ったけど、13MBっていまどきなら別にでかくないか。
>>286
IEだとダウンロードしながら表示できたと思ったけど、Linux上でMozillaだと
全部ダウンロードしてからAcrobatReaderが起動するんで、結局ファイルgetと
同じになっちゃうんだけど(w

いちおー、
http://www.jisc.go.jp/jis-act/reading.html
によると「入手」は有料で購入、「閲覧」はご自由にという感じなんで
(その二つの差に意味があるのかという話はさておき)、それなりに節度を守って
利用しましょということで。
0296デフォルトの名無しさんNGNG
>>295
WindowsのNetscapeCommunicator4.78でみたらTEMPフォルダに残っていた。
0297専門学校1年生NGNG
またきました。
文字列のmojiaの12文字をmojibにコピーする作業なんですが、
またしても壁にぶつかっております。
おねがいします。

#include<stdio.h>

void main()
{
char mojia[]="syunka syuutou haru itiban";
char mojib[13];
int i;

for(i=0;i<12;i++);
mojib[i]=mojia[i]; /*←これでは代入されてませんか?*/
mojib[12]='\0';
printf("コピーされた文字列は%sです。\n",mojib);
printf("%c\n",mojib[1]);
}
0298ほらよNGNG
for(i=0;i<=12;i++)
memcpy(mojib+i,mojia[i],1);
0299デフォルトの名無しさんNGNG
for文の末尾をよーく見てみなされ。
あと、宿題は別スレがあるのでそっちの方を推奨しとく。

宿題とか手伝えます
http://pc3.2ch.net/test/read.cgi/tech/1026138039/
0300298NGNG
for(i=0;i<12;i++)
に訂正
0301デフォルトの名無しさんNGNG
>>295
あああ。Mozilla使えばよかったのか。
IEで見てみたら変な小細工がしてあったんで、
ソース読んでこっちもいろいろ変な小細工してgetしちゃったよ。
0302専門学校1年生NGNG
恥ずかしい!(>_<;

出直してきます。

ありがとうございました。
0303デフォルトの名無しさんNGNG
>>282
フォントが腐ってて見れたもんじゃない
0304デフォルトの名無しさんNGNG
IE(5.5)でも小細工するまでもなくGetできるじゃん・・・・
でも、これってわざと画質落としているのかな?
それとも印刷物をスキャナーにとおしたのか?
有料で購入した物がこのレベルならマジシャレにならないな・・・・・
0305デフォルトの名無しさんNGNG
DOS7.0からMS-CでTCP/IP通信やりたいのです。
VC++やUNIXでなら、Winsockや標準のソケット関
数使って組んだことあるのですが、DOSは初めて
です。MS-Cってソケット関数あるんでしょうか?
MSのLANMANとか入れると使えるようになるとか
なのでしょうか? 厨な質問ですみません。
0306デフォルトの名無しさんNGNG
IBMのWebBoyだっけ?
0307デフォルトの名無しさんNGNG
それくらい自分でつくれ
0308デフォルトの名無しさんNGNG
>>304
売ってる規格票はさすがにちゃんとした印刷になってるよ。
スキャンする際にかなり画質を落としてるんじゃないかな。
0309305NGNG
>> 306
あとPC/TCPとかパッケージはいくつか知っているのですが、それらを使わずに
何とかしてみたいのです。市販されているってことは(売り物になっていると
いうことは)やはり技術的に難しいのですかね・・・。(T_T)
0310デフォルトの名無しさんNGNG
まずは、ブルーブック読む。
0311sxNGNG
データのバイト数を調べるプログラムってどうかきますか?
0312デフォルトの名無しさんNGNG
どんなデータ?
0313sxNGNG
追加です
データを標準入力から読み込むプログラムと
データをコマンドラインから読み込むプログラムはどう書きますか?
0314デフォルトの名無しさんNGNG
コマンドラインから読み込む程度の量のデータのバイト数を調べるの?
0315デフォルトの名無しさんNGNG
>>313
本買って読めよ…
0316デフォルトの名無しさんNGNG
C言語で、スクリーンセイバーを作れといわれました、
当方VB・ASP・JAVAしかやったことがありません。
参考になるページか本ありませんか?
0317デフォルトの名無しさんNGNG
>>316
スレ違いぽいなぁ
0318デフォルトの名無しさんNGNG
>>313
int main(void)
{
if(EOF == getc(stdin)) print("0\n"), return 0;
if(EOF == getc(stdin)) print("1\n"), return 0;
if(EOF == getc(stdin)) print("2\n"), return 0;
if(EOF == getc(stdin)) print("3\n"), return 0;
以下、調べたいデータの最大まで書いていく、
0319あやNGNG
1行に書かれた2桁の2つの数の四則演算の式の値を求めることができるプログラムを作る。
というのなんですがCで作るのですがさっぱりわかりません。
だれか知識のある方作っていただけませんか?
おねがいします。
0320デフォルトの名無しさんNGNG
>>319
マルチ氏ね。
0321デフォルトの名無しさんNGNG
>>320
お疲れ様です
0322あやNGNG
>>321
お疲れ様です。Cしてあげます。
0323デフォルトの名無しさんNGNG
>>322
はーい、あやちゃん。しーしましょうね。しー。
0324デフォルトの名無しさんNGNG
>>319
値を求めるだけなら。
int main(void)
{
  int a = 10 + 20;
  return 0;
}
0325デフォルトの名無しさんNGNG
四則演算って、和差積商全部求めるん?
0326デフォルトの名無しさんNGNG
式は標準入力から入るとして、
OSはgccのあるUnix系と仮定
バッファあふれとかはとりあえず無視。

int main(void)
{
char buf[80];
FILE *fp;
gets(buf);

fp = fopen("tmp.c", w);
fprintf(fp, "#include <stdio.h>\nint main(void){printf(\"%d\n\", buf);return 0}");
fclose(fp);
system("gcc tmp.c");
system("./a.out");
return 0;
}


0327デフォルトの名無しさんNGNG
sample.cが大きくなったので,関数の部分を分けようと思い,foo.hとfoo.cを作って関数と
大域変数を以下のように書いたのですが,(A)の場所で「error C2159: 2 つ以上の記憶
クラスが指定されています。」というエラーがでてしまいます.
extern を消すとコンパイルされるのですが,dictionaryの値がちゃんと保持されません.
どうしたらよういのでしょうか.
Windows2000でVC++6.0を使用しています.

○sample.c
#include "foo.h"

static int dictionary[200][100];
int WINAPI WinMain ( 略)

○foo.c
#include "foo.h"
extern static int dictionary[200][100];  <---(A)

int WriteClip(HWND hwnd, int *Data)
{
(略)

○foo.h
int WriteClip(HWND hwnd, int *Data);
0328デフォルトの名無しさんNGNG
とりあえずstaticをとったら?
0329デフォルトの名無しさんNGNG
>>327
staticは変数のスコープを現在の翻訳単位に制限してしまうので、
この場合はまずい。
0330デフォルトの名無しさんNGNG
>>327
意味もわからずにstaticなんてつけんじゃねーよヴォケ
0331デフォルトの名無しさんNGNG
>>330
まあまあ。
staticには二つの意味があるし許そうよ
0332デフォルトの名無しさんNGNG
extern static
0333327NGNG
もうしわけありません...プログラムを見直していたら気が付きました...
最初,関数内でdic配列を定義.大きな配列を指定するとスタックオーバーフロー
をおこすので,static宣言をしました.その後,dicをローカル変数からグローバル変数に
したが,staticを外すのを忘れておりました.そのため,dic配列がそのファイルに
ローカルになっているのに気が付きませんでした...
0334デフォルトの名無しさんNGNG
いかん、long short とか unsigned signed とか試したくなってきた。
0335デフォルトの名無しさんNGNG
extern static unsigned signed near far huge long short i = 0;
0336あやNGNG
なんか偽者がいますね・・・
返事遅れましたがありがとうございました。
■ このスレッドは過去ログ倉庫に格納されています