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

C言語なら、俺に聞け! lt;50gt;

■ このスレッドは過去ログ倉庫に格納されています
0001鼻から悪魔でますたNGNG
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しろ。
むしろ質問する前にWEBで検索するのが常識だ。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへ行け。
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへ行け。

コンパイラを探しているなら >>2 を見よ。

上記を逸した場合の結果は激しく未定義とする。

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/
0232186 NGNG
>>223
A.授業についていけない、おちこぼれだったからです。(^^;
0233230NGNG
>>231
はえー(ワラ
0234デフォルトの名無しさんNGNG
>>231
用意してたの?
0235デフォルトの名無しさんNGNG
>>232
でもコンパイル作業くらいはわかっただろ?
もしかしてプログラミングなのに実習がなかったのか?^^;
0236231NGNG
ぬるぽスレ開いてコピペしただけだよ(w
リロードのタイミングがよかっただけかも(w
0237186 NGNG
>>235
担当の先生が答えを教えてくれないんですよ…、
自分で勉強しろ、こんぐらい雑魚でもわかる筈だろ…って。
でも私はプログラミングの経験が足りないから、シンプルなところでつまづいて
しまって…、簡単なんだけど、なかなか気づかない、一言で言えば私の勉強不足なんです。
0238デフォルトの名無しさんNGNG
>>237
勉強に関しては自分で勉強するてのは原則ではあるんだが…
質問しにいって答えなかったとかならちと問題ありかも
0239186 NGNG
>>238
先生と乖離している部分があって…先生は簡単なことだから説明を省略してしまったようです。
#defineなんて簡単なことだし。すばらしい先生なんですけど。
でも、確かに簡単なことなんだけどバカのボクにはわからなくって。
家に帰ってコンパイルしてみたらエラーでるし、今日試験だし・・・・
正直パニクッたからこのスレにきました。
0240デフォルトの名無しさんNGNG
先生を すばらしいと 言える あなたは すばらしい。
0241デフォルトの名無しさんNGNG
単発質問スレを立てずにここに来ただけで十分ましだな。
0242デフォルトの名無しさんNGNG
>>186 あたし
>>237 私
>>239 ボク
0243デフォルトの名無しさんNGNG
>>242
観察するなよw
0244デフォルトの名無しさんNGNG
みんな「してやられたぜ!」な気分かな〜と思って。
0245デフォルトの名無しさんNGNG
>>224
何で extern "C" が必要かを知らないクチかな?
オーバーロード、名前空間という C++ の機能を考えれば
分かると思うよん。
VC++ なら次のコードをビルドしてみれ。

void foo() { }
void foo(int) { }
namespace hoge { void foo(); }
extern "C" void foo(int, int) { }
void main() { foo(); foo(0); hoge::foo(); foo(0, 0); }

多分こんなリンクエラーが出ると思う。
Test.obj : error LNK2019: 未解決の外部シンボル _foo が関数 _main で参照されました。
Test.obj : error LNK2019: 未解決の外部シンボル "void __cdecl hoge::foo(void)" (?foo@hoge@@YAXXZ) が関数 _main で参照されました。
Test.obj : error LNK2019: 未解決の外部シンボル "void __cdecl foo(int)" (?foo@@YAXH@Z) が関数 _main で参照されました。
Test.obj : error LNK2019: 未解決の外部シンボル "void __cdecl foo(void)" (?foo@@YAXXZ) が関数 _main で参照されました。

オブジェクトファイルとかの中では実際には
 extern "C" foo → _foo
 hoge::foo() → ?foo@hoge@@YAXXZ
 foo() → ?foo@@YAXXZ
 foo(int) → ?foo@@YAXH@Z
とか名前が変わってるわけ。(変わり方はコンパイラ依存)
extern "C" のある時(Cを使った時)とそうじゃないときじゃ
全然名前の変わり方が違うっしょ?
C++ だと引数の型や名前空間の情報も名前に含めるの。
これが同じ名前の関数を複数定義できる仕組みでもあるわけだけど。

extern "C" を使わないで何とかするんじゃなくて、
extern "C" を使って何とかする方向で考えるべきだと思われ。
0246デフォルトの名無しさんNGNG
↓わかったか!
0247デフォルトの名無しさんNGNG
>>246
おおむねわかったぜジョニー
0248デフォルトの名無しさんNGNG
これ C++ スレの話だよな。
0249デフォルトの名無しさんNGNG
>>245
勿論、解った上で聞いてるんだが…。
そうですか、無理ですか。
0250デフォルトの名無しさんNGNG
じゃあ、C++のライブラリをCで使う方法を教えて下さい。
0251デフォルトの名無しさんNGNG
無茶言うな
0252デフォルトの名無しさんNGNG
ユークリッドの互除法で最大公約数を求めるプログラムを作ってみたんですが、
これ以上に簡潔な書き方ってありますでしょうか??暇な人いたら見てやってください。
#include <stdio.h>
int uclid(int,int);
void main()
{
int a,b;
while (1){
printf("a="); scanf("%d",&a);
printf("b="); scanf("%d",&b);
if (a <= 0 || b <= 0) break;
if (a >= b) printf("%d\n",uclid(a,b));
else printf("%d\n",uclid(b,a));
}
}
int uclid(int a,int b)
{
int n;
while (a%b != 0){n=a; a=b; b=n%b;}
return (b);
}
0253デフォルトの名無しさんNGNG
void ?foo@hoge@@YAXXZ(void);
とかやって使えばいいじゃん。
? とか @ が識別子に使えないならコンパイラを改造してさ。
0254デフォルトの名無しさんNGNG
11.14:
void main()と宣言してうまくいかないわけがないと思う。なぜなら main()から戻る代わりに、exit()を呼んでいるから。だいたい今使っ ているO/Sはプログラムのexit値/戻り値を無視する。

A:

main()から戻ってくるかどうかは関係ないし、そのステータスを見る かどうかも関係ない。問題はmain()の宣言がおかしいと、呼び出し側 (実行時のスタートアップのコード)がmain()を正しく呼び出すことす らできないかもしれないことにある。

君が使っているO/Sは終了時のステータスを無視して、void main()で もうまく動くかもしれない。しかし、このやりかたは移植性が低いし、 正しくもない。ボク女(;´Д`)ハァハァ
0255デフォルトの名無しさんNGNG
>>253
ただ呼ぶだけじゃだめだな。
コンパイラがthisをどう渡すかとか、vtblの扱い方とか知らないと。
0256デフォルトの名無しさんNGNG
>>254
ボク娘は確かに萌えるが、何故に?
0257デフォルトの名無しさんNGNG
exit()で終了するのは綺麗ではないと思う。
たとえmainからでもちゃんとreturnしたいね。
0258デフォルトの名無しさんNGNG
カーネルのコードとか、void main 使ってるよね。確か。
0259デフォルトの名無しさんNGNG
mainはないよ
0260デフォルトの名無しさんNGNG
zoid main(zoid)
0261デフォルトの名無しさんNGNG
じゃ、デーモンだったかな?
0262デフォルトの名無しさんNGNG
漏れも exit() はキライ
構造化の基本を無視してる
0263デフォルトの名無しさんNGNG
exit嫌いはC使う資格なし
0264デフォルトの名無しさんNGNG
俺も嫌いだ。
が、面倒な時は使う。
0265デフォルトの名無しさんNGNG
>>264
面倒じゃないときはどうしている?
0266デフォルトの名無しさんNGNG
bool 値返して全部ちゃんとエラー処理してる。
0267デフォルトの名無しさんNGNG
ああ、エラー時に即終了させるってのがいけないと言っているのか。
0268デフォルトの名無しさんNGNG
ていうか、むしろexit使う時なんてある?
使ったことないよ。
0269デフォルトの名無しさんNGNG
ちゃんとエラー処理してれば、自然に main に行き着くと思うのだが。
0270デフォルトの名無しさんNGNG
main内でreturnでなくあえてexitを使う意味とは?
まさかvoid mainだから?
0271デフォルトの名無しさんNGNG
exitとかロングジャプンとか
一度は使ってみたいけど
機会がない
0272デフォルトの名無しさんNGNG
>>269
void usage()
{
  fprintf(stderr, "cmd: [-H | -L ] [-Aoutd] [file...]\n");
  exit(1);
}
などは典型的な例だが見たことないか?
mallocに失敗した場合にできることが殆どないプログラムの
場合は、単にエラーを吐いて死ぬようなmallocラッパーを使うことも
多いだろう。
0273デフォルトの名無しさんNGNG
>>272
なるほど、
でも、やっぱり使わないなぁ…
所詮は好みの問題か。

他にはcoolな使い方無いかな?
0274デフォルトの名無しさんNGNG
>>252
uclid()の仕様が……
大小判断くらい関数内でしてもいいんでないかい?
それと、私ならscanf()は使わない。

どうでもいいけど、
while (1)
と
return (b);
がもにょる。
0275デフォルトの名無しさんNGNG
私はexit()を使わない方。

int main(int argc, char **argv)
{
 /* 処理 */
 if (/* 条件 */) {
  usage(argv[0]);
  return EXIT_FAILURE;
 }
 return EXIT_SUCCESS;
}
0276デフォルトの名無しさんNGNG
>>275
mainにいないときは?
0277デフォルトの名無しさんNGNG
argv[0]を渡す意味がわからん。
0278デフォルトの名無しさんNGNG
漏れは

return usage(/*argv[0]もあるかな*/);

かな。
argv[0]はウィンドズだと変になるからねぇ。
0279デフォルトの名無しさんNGNG
>250
COMをまなびなはれ
0280デフォルトの名無しさんNGNG
>>276
main() 以外のいろんな箇所から、使用法を表示して直ちに終了という処理が
必要になるなら、プログラム設計をやり直した方がいい。
0281デフォルトの名無しさんNGNG
#include <stdio.h>
int uclid(int a,int b){
int n;
while(a%b){n=a; a=b; b=n%b;}
return b;
}
void main(){
int a,b;
while (1){
printf("a="); scanf("%d",&a);
printf("b="); scanf("%d",&b);
if (a <= 0 || b <= 0) break;
printf("%d\n",uclid( a<b?b:a, a<b?a:b));
}}
0282デフォルトの名無しさんNGNG
a,bにunsigned付けときゃ負の判定要らんか?
0283デフォルトの名無しさんNGNG
mallocって充分に速いのか?
予め多く確保しておいた方がいいのか?
0284デフォルトの名無しさんNGNG
ファンクションの定義というのはどうやったらいいのでしょうか?
関数の定義の仕方は解るのですが、同じような感じにやったらいいのでしょうか?
初心者な質問ですみません…
0285デフォルトの名無しさんNGNG
その前に関数とファンクションの違いを述べてくれ。
0286デフォルトの名無しさんNGNG
>>283
測定すればいい。それが「十分に早い」かどうかは、そのプログラムに対する
性能要求・環境・mallocの実装の質etc...に依存するので、一般的な回答は
有り得ない。
それでも敢えて云うならば、平均的なC++プログラムではそれこそ山のように
new/deleteが暗黙に使用される(自分で呼んだつもりはなくとも、stringや
vectorのような一般的な道具を使うたびに当然暗黙には使用される訳だ)
ことを考えれば、いわゆるHosted environmentにおいてCを使っている分には、
mallocの性能なんぞ気にする必要はなかろう。
0287デフォルトの名無しさんNGNG
今学校から携帯で書き込みです
五個の配列を合計して割って平均値を出したいのですがこのソースでできますか?今コンパイル環境がないのでよろしくお願いします
int test[5]={100,90,80,70,60}
int count,avg;
avg = 0;
for(count=0; count<=4; count++){
avg=avg+test[count];}
printf(゙%d\n゙,avg/5);
0288デフォルトの名無しさんNGNG
>>287
出来ない。
0289デフォルトの名無しさんNGNG
ネタでないことを祈るが
1行目の;が(ry
avg(ry)sum(ry
ダブルコーテーションが(ry
mai(ry
0290デフォルトの名無しさんNGNG
全角文字のA→Zまでを出力したいんだけど、
○の部分にはなにをいれればいいです?
検索のキーワードのヒントだけでもいいです。

#include<stdio.h>

int main()
{
unsigned int i;

for(i = 'A'; i <= 'Z'; i++)
{
printf("%X, %○\n",i, i);
}

return 0;
}
0291デフォルトの名無しさんNGNG
>>290
カコイイ!
0292デフォルトの名無しさんNGNG
>>287
つまり、テスト中に携帯からカンニング中ということですか?
0293デフォルトの名無しさんNGNG
>>290
マック使いカコイイ!
それかX68kか?
0294290NGNG
あ、ちなみにVC6です。

>>291, >>293
やっぱ、このソースじゃ全角文字の出力は無理?
0295デフォルトの名無しさんNGNG
''でASCII以外の文字囲めるの?
0296デフォルトの名無しさんNGNG
unsigned int i;
for(i='A'; i<='Z'; i++)
{
 printf("%04xH, %c%c\n", i, i>>1, i&0xff);
}

マックだよね?
0297296NGNG
>>294
マックじゃねぇのかよ。
じゃあひっくり返したらいいよ
0298デフォルトの名無しさんNGNG
>>297
ひっくり返すってのは1バイト目と2バイト目をひっくり返すってこと?
0299デフォルトの名無しさんNGNG
>>295も云ってるが、今どきの普通の計算機ではchar型=1byte=8bitであって、
少なくとも俺が知っている範疇のC言語ではシングルクオートによる
文字リテラルではchar型しか扱えないんだから、その中に
ワイド文字がブチこんである時点でよく分からない。
本当はL'A'
と書いてあったのか?
だとすると、エンディアン変換を適当に行って1バイトずつ出力しても
思ったとおりの結果にはならない可能性が高いよ。ワイド文字の
エンコーディング方式は規格上は何も定義されていないが、
多くの処理系はそれをUCS2/UCF16/UTF32などでエンコードするからね。

0300デフォルトの名無しさんNGNG
>UCS2/UCF16/UTF32
すまんUTF16の間違いね。もちろん。
0301デフォルトの名無しさんNGNG
>>299
少なくともSunOSでは扱える。
Versionが4の頃と5になってからではバイト順が変わってしまった気がするけど。
0302デフォルトの名無しさんNGNG
#include <stdio.h>
int main(){
unsigned int i, z, w;
i=*(unsigned int *)"A\0\0";
w=(i&0xff)<<8;
i=(i>>8)|w;
z=*(unsigned int *)"Z\0\0";
w=(z&0xff)<<8;
z=(z>>8)|w;
for(; i<=z; i++)
{
printf("%02x%02xH, %c%c\n", i>>8, i&0xff, i>>8, i&0xff);
}
}

携帯だから確認できん、だれか試して。
0303デフォルトの名無しさんNGNG
わざわざ引っくり返さなくてもprintf()で順番変えればいいじゃん。
0304デフォルトの名無しさんNGNG
>>303
forの時にヤバイのよ。
0305デフォルトの名無しさんNGNG
どうせ実装依存なんだから、
i += 256;
でいいと思ったり。
0306デフォルトの名無しさんNGNG
リッチなカニチャーハンの本の誤植?は改訂版でも修正されてないですか?
0307デフォルトの名無しさんNGNG
>>302
お、できた。
ありがとう。
0308デフォルトの名無しさんNGNG
3連文字って誰が使うの? インド人?
メヂャーな国で使うとこってあるの?
スペーンとかフランスとか、、、
0309デフォルトの名無しさんNGNG
strdupってC999から標準になった?
なったよね?
0310デフォルトの名無しさんNGNG
>>308
北欧各国で使うんでない?
0311デフォルトの名無しさんNGNG
forkはC9999から標準になる予定
0312デフォルトの名無しさんNGNG
C9999なんて要らん。C9989で十分。
0313デフォルトの名無しさんNGNG
C99999から文字列型stringを標準サポート
0314デフォルトの名無しさんNGNG
その前にガベコレ
0315デフォルトの名無しさんNGNG
 ぬ  る  ぽ
0316デフォルトの名無しさんNGNG
>>315
ガッ
0317デフォルトの名無しさんNGNG
ここって初心者の質問でもOKでしょうか。

int hage[3000];
という配列の hage[1901]からhage[2030]までを値を代入して初期化したいのですが、
hage[]={ 1,2,3,4,5,6,7,8,9 ・・・・・};
みたいなふうにして、1901から値を代入することってできますか。
方法があれば教えてください。
今は、別配列にいったん入れてからコピーしています。
0318デフォルトの名無しさんNGNG
初心者の質問しか受け付けません

>>317
入れる値がばらばら(規則性がない)なら一つずつ入れるかあなたの言うようにmemcpyなどで別配列からコピーするしかない。
0319デフォルトの名無しさんNGNG
>>317
年を入れるつもりなのだな。
それなら、int hage[130]で宣言して、i+1901で参照すればいいのでは?
0320317NGNG
回答ありがとうございまふ
入れる値は規則性は、厳密に言えば無くはないんですが、複雑で別プログラムで計算したものを
代入しています。
やっぱり方法はないんですか。
配列は最終的には、3000全部使う予定なので>>319さんの方法ではだめなんです。

int hage[1900]=[1,2,3,4,5,6,・・・];
みたいに書くことができれば理想なんですが。
0321デフォルトの名無しさんNGNG
C言語は、どのくらいで習得できますか?
0322デフォルトの名無しさんNGNG
>>321
そのうちに習得できます
0323デフォルトの名無しさんNGNG
>>321
大体1週間くらいあれば十分かな。
0324デフォルトの名無しさんNGNG
>>321
この週末だけで習得可能 
0325デフォルトの名無しさんNGNG
http://ime.nu/3.141592653589793238462643383279502884197169399375105820974944592.jp/
0326デフォルトの名無しさんNGNG
>>320
コンパイラが耐えられるのであれば、何らかのプログラムで
初期化する式(コード)を生成して、それをソースにするという手はある。
PerlとかRubyとかawkとかいったスクリプト言語系ならお手軽だろう。
0327デフォルトの名無しさんNGNG
>>287
宿題スレに行け
0328デフォルトの名無しさんNGNG
union {
 int a[3000];
 struct{
  int b[1900];
  int c[2100]={1,2,3,3,5,6};
 };
};

ってのは無理なのですか?
0329デフォルトの名無しさんNGNG
>>328
名前の無い構造体って作れたっけ?
0330デフォルトの名無しさんNGNG
>>329
問題はそこでなく、配列を途中から初期化することで、、
0331デフォルトの名無しさんNGNG
>>328
・書式が間違っている。
・1900+2100は4000だろう。計算はできるだけ自分でするな。
・こうすりゃできるけどやっぱり面倒だぞ。

#define SEC1LEN 1900
#define SEC2LEN 1100

union {
 struct {
  int sec1[SEC1LEN];
  int sec2[SEC2LEN];
 } sec;
 int all[SEC1LEN + SEC2LEN];
} data = {{{0,}, {1, 2, 3, 4, 5,}}};
■ このスレッドは過去ログ倉庫に格納されています