CMAGAZINEのガイドに従ってBorland C++ Compiler 5.5.1の「コンパイルの 実行手順」まで来ました。Hello, World!というソースプログラムを用例通り に作ってc:\に「cppprog」フォルダを作成しました。 コマンドプロンプトの\system32\cmd.exeの画面で C:\Documents and Settings>の後にcd \cppprogを入力しenterキーを押すと 「指定されたパスが見つかりません。」と表示されます。なぜか教えてください。 保存の状態は、C:→Documents and Settings → 大野→ My Documents → cppprogフォルダです。 よろしくお願いします。
cd "C:\Documents and Settings\大野\My Documents\cppprog"
ユーザーアカウント名?Oh no!
cd \cppprog だと、 C:\cppprog になる cd cppprog なら、現在の場所からの相対位置になる
C言語についてじゃないな、却下。
最近この手のプログラミング以前の質問多いよな
>293, 204, 295ありがとう。 漢字を打ち込む方法を教えてください。
>>298 ショートカットの作業フォルダに指定するべし
まあ漢字めんどうならTABキー連打で
>301 TABキーで C:\Documents and Settings\All Users>まで進みました。 この後ろへcd \My Documentsを入力しエンターキーを押すと、 「指定されたパスが見つかりません。」が出ました。 対策を教えてください。
サーバやモジュールはgetsを使える場面があるのか… 標準入力もまだまだ捨てたものじゃないってことだな やったことないから勉強になった
>303 Documents and Settings\All Users>cd cppprogでエンターキーでも 「指定されたパスは見つかりません。」が出ます。
All Usersじゃなくて、自分のログインネームで 一個上に行くのは、 cd .. な
コマンドライン初めてなら、それなりのとこ見ながらやったほうがいいよ そこからコンパイルまでいくのは大変だし、ここはスレ違いになるから みんな相手してられなくなるぞ
ルート直下でやればいいじゃん
>306 当たり前ですが、Borlandに対するログインネームでしょうね。 「一個上に行く」というのは,>cd ○○○○(ログインネーム)と 置くことを指しているのでしょうね。
OS :Borland
312 :
311 :2007/08/23(木) 14:31:45
ちょっと質問なんですけど、たとえば key=value という文字列をsscanfをつかって'='で分解したいんですが char text[256] = "key=value"; char *key,*value; sscanf(text,"%s=%s",key,value); という感じで打ってもできませんでした。だれかご教授おねがいします
BorlandっていうOSは知らないなぁ
だーかーらー カレントディレクトリが C:\Documents and Settings\All Users なんだったら、 その状態で cd cppprog ってやったら C:\Documents and Settings\All Users\cppprog へ移動することになるし、cd 大野 ってやったら C:\Documents and Settings\All Users\大野 へ移動することになる。もちろんそんなディレクトリは存在しないから、エラーが出るわな。 君が移動したいのは C:\Documents and Settings\大野\My Documents\cppprog だろ? だったら1つ上のディレクトリ(つまり C:\Documents and Settings)に戻ってから、 大野 → My Documents → cppprog へと移動すればいい。 具体的には cd .. cd 大野 cd "My Documents" cd cppprog と順に移動していけばいい。 だいたいなんでCマガの書いてあるようにやらないんだよ。
>>312 OSはおいといて、key と value の領域確保の問題が一つ。
もう一つは、keyが"="まで読み込んでしまうこと。
"%[^=]=%s"とかでどうか
>314 問題は、漢字のフォルダ名をコマンドプロンプトへ 打ち込めないことです。フォルダ名をローマ字に変えようと してもできません。よろしく。
>>317 コンパイラ起動できるようになるまで、Win板で聞いたら?
とりあえず
>>300-301 ちなみに、
C:\Documents and Settings\大野\My Documents
は、エクスプローラーの「マイ ドキュメント」のことだって知ってたか?
せっかく答えてもらったのに礼は言わない、 それどころかレスをまともに読んですらいない、 救いようがないなこりゃ
さすがに釣りだろwww
321 :
デフォルトの名無しさん :2007/08/23(木) 16:05:44
おじゃまします。質問です。 typedef struct{ char a[2]; char b[3]; char c[4]; }AA; typedef struct{ char e[16]; }BB; AA aa; BB bb; …こんなんで、aaに代入された値をbbに一発で書き込んで、 しかもスペースで埋めてくれる関数とかありませんか? VBからCに書き直してたら、LSetで一発だったので。。
関数使わんでもできるけど、一発(スペース埋めるなら2発か)でやるなら memcpy() と memset() でどうか
>319 ありがとうございました。cd 大野といわれても漢字をコマンド プロンプトに打ち込めないみじめさ。嬉しさも中ぐらいなり、秋の風。
どうしても無理ならマウス使ってコピペ 右クリックかシステムメニューでできる
Alt+半角/全角 で入力できるぜ
326 :
321 :2007/08/23(木) 16:35:43
>322 できました。ありがとうございます!
>>322 ,326
構造体のパディングは大丈夫なのか?
文字列の連結ではないのか?
いやできたならいいんだけど。
同じ型が続いてるなら多分パディングはないんじゃないかなあ。
パディングはcharが並んでるだけだったからあえて書かなかったが LSetの仕様を考慮しないとね。どっちにしても一発は厳しい
330 :
デフォルトの名無しさん :2007/08/23(木) 19:09:03
char *func_b( char *str, char ch ) { char *p; for( p = str; *p != '\0'; p++ ) if( *p == ch ) return p; return 0; } これと同等の処理を行う標準ライブラリ関数を教えてください お願いします
strchr?
strchrかな
Borland
334 :
デフォルトの名無しさん :2007/08/23(木) 20:23:42
>>331-333 ありがとうございます
strcharだと
char *func_b( char *str, char ch )
じゃなくて
char *func_b( char *str, int c)
になるんじゃないかと迷ってました
プログラム実行できました。今日中にできるとは思いませんでした。 Borland C++ Compiler のつぎはTurbo Debuggerです。 ありがとう!ありがとう! >293,294,295,314,318, 325さんAlt + 半角/全角や漢字のコピペが可能だとは驚きでした。 まだいろいろ教えていただくこともあろうと思います。
>>321 memset(&bb, ' ', sizeof(bb));
bb = aa;
これでいいような気がするんだが、
構造体の要素って順番に並んでるとは規定されてないけどね。
>>334 char *strchr (const char *s, int c) だよ
338 :
312 :2007/08/23(木) 20:38:42
レス遅くなってすいません。
>>316 の[^=]を使う方法を試したのですがうまくできなかったです。。。
strtokを使うしかないって事ですかね
>>336 >構造体の要素って順番に並んでるとは規定されてないけどね。
またいい加減なことを…ここは入門者が答えるスレ?
>>336 だからgets肯定派のダンディ坂野は回答しなくて良いよって言っただろ?
ったく、これだから夏厨は・・・
>bb = aa;
344 :
336 :2007/08/23(木) 22:11:17
パディングが挟まってる可能性はあるが、順番はそのまま。
全くの初心者です。質問ですが、 #include <stdio.h> main() { printf("Hello World\n"); } を、Cygwinでコンパイルしたいのですが、うまくいきません。 何故でしょうか。
エラーメッセージを読め
gcc インストールし忘れているに 100 ガバス
>>338 どううまくできなかったのか。
ちゃんと
*key は key[128]
*value は value[128]
とかにしたか?
ヘッダーファイルについて質問なのですが、自作ヘッダーにsleepという関数を 作るとします。実際この関数を使おうと#includeしようとしたら同じく#includeした time.hライブラリーにも同じ関数がある事に気づきました。 同じ名前の関数がある場合、関数の使用優先度って何で決まるんですか?
>>350 多分リンクした順だけど、普通はリンク時にエラーがでると思うよ
先にldが見つけたほうではないかな? ふつうは自作の関数の名前を変えると思うんだが
そうなんですか。eclipse,CDTで開発してるんですが、予想通りでした。 ありがとうございました。
>>351 エラーは出ないんじゃないかな。
関数の戻り値なり引数なりの型が違うなら、
コンパイル時にエラーになると思う。
警告かも知れない。
Japan 1 0 2 Spain 2 0 1 Egypt 1 2 0 のように入力して、数字を左から 3点 0点 1点分と数えて点数の高い順に並べ Spain, 7 Japan, 5 Egypt, 3 のように出力したい場合二次元配列使うと思うんだけど、データの型はどうすればいい? 全部intで出力のときだけ %s,%d で合ってますか?
>>355 おれだったら、構造体の一次元配列で処理する。
struct hoge { char name[1024]; int mark; }
生のデータを持つために、 struct { char name[1024]; int mark[3]; }
a = (struct A *)buf; b = (struct B *)buf+20; Bの構造体にbufの20バイト後から取り出したいんだけど この記述はできない?
>>359 bufがchar *などであるなら、
struct B b=*(struct B*)(buf+20)
offsetとか使いたいのではないのかなあ
364 :
359 :2007/08/25(土) 22:23:25
一応できた. でもあんまり理解してないorz
システムコールってC言語ですか?
共用体(union)の中で構造体使うと うまく領域を確保できなくてデータが変になる現象が起きてます。 今は使わない文字配列を共用体の中に書いて 無理やり余裕を持たせて領域確保してるんですが 共用体で使うメモリ領域をうまく確保する方法はありますか? ちなみに環境はVineLinux4.1でgcc3.3.6コンパイラ使ってます。
うまくいかないソースと現象の詳細を示せ
368 :
366 :2007/08/26(日) 08:00:38
説明しにくいんですけど 2Dのrobocup用ライブラリlibsclientをいじってて http://www.koders.com/c/fidD6E7EBDD071F6F9579D1CAF12EF2FC434F5F7074.aspx 292~295行目 typedef struct _Ppos { WhichTeam team ; // enum(WhichTeam=int) int unum ; } PlayerInfo ; に「int type;」というのを追加してライブラリとプレイヤーを再コンパイルして 実際にサーバーに接続してみたら動作が明らかに変になるんです。 312~317行目 union { PlayerInfo player ;// 292~295行目の構造体 Side side ; // enum(Side=int) FlagPos fpos ; // enum(FlagPos=int) LinePos lpos ; // enum(LinePos=int) } id ; ここに「char hoge[30];」を追加すると問題なく動作するようになるんで 共用体で構造体の大きさの領域が確保できてないという結論に至ったわけです。
結論に至る前に sizeof で大きさを調べてみろ
make cleanしてないんじゃねーの?
>>365 システムコールはC言語でもサポートされていますが
システムコールはC言語ではありません
372 :
366 :2007/08/26(日) 13:49:54
>>370 それでしたorz
ライブラリとプレイヤ自体はmake cleanしてたんですが
ライブラリを読み込んでるプレイヤ共通の関数をまとめたやつをし忘れてました。
>>367 ,
>>369 ,
>>370 こんな僕にレスしてくれてありがと
相談なんですが,ファイルに以下のように保存されていて, a[1]=AAA a[2]=BBB a[4]=DDD これを以下のように新規で追加,削除,変更などしたい場合, a[1]=AAA a[2]=ABC a[3]=DEF 一回全部読み込んでbufなどに保存し,それから一気に全部ファイルへ書き込む方法が あると思いますが,それ以外に方法ありますか?
>>373 固定長レコードもファイルならfseekで該当レコードのところにファイルポインタを
位置決めしてfwriteでレコードを上書き。
>>373 データをファイルの最後尾に書き込みして
読み込み時、重複する場合は「もっとも後ろにあるデータ」を有効とするとか
たとえば
a[1]=AAA
a[2]=BBB
a[4]=DDD
↓
a[1]=AAA
a[2]=BBB
a[4]=DDD
a[3]=DEF
a[2]=ABC
a[4]=
読み込み時にデータ(a[2]=BBB)をデータ(a[2]=ABC)で上書きする感じ
a[3] は新規追加、a[2]は変更、a[4]は値なしなので削除
>>374 その標準関数を使ったことないんで調べてみます
>>375 その方法も考えたんですが,何回も書き込みを行うとデータが多くなり
読み込むのに時間がかかりそうなんで,有効データだけ残す方法をとりたいですね
お二人様サンクスです!検討してみます
377 :
デフォルトの名無しさん :2007/08/27(月) 17:11:43
超初心者ですみません。 2の0乗+2の1乗+2の2乗+2の3乗+2の4乗+・・・ というプログラムはどのようにしたらよいのでしょうか? いろいろ調べてかいてみたのですができませんでした>< どなたかアドバイスお願いしますm(__)m
1 + 2 + 2 * 2 + 2 * 2 * 2 + 2 * 2 * 2 * 2 + ...
for(n=1, sum=0;;n*=2) sum+=n;
>>377 しょぼくて申し訳ないが、
int hoge(int count){
int result = 1;
if(count <= 0)
return 1;
for(int i=1;i<count;i++){
result += 2*i;
}
return result + hoge(count-1);
}
二進法で結果を出力するプログラムならこれでいいよ。 #include <stdio.h> int main(void) { for (;;) putchar('1'); }
// ウンコード int func(size_t n) { int ret = 1; size_t i; for (i = 1; i < n+1; ++i) ret += 1<<i; return ret; }
ウンコードなんて、クソースのパクリみたいだな、¢50徴収するぞ?
ビット演算凄いです^o^
387 :
デフォルトの名無しさん :2007/08/27(月) 21:15:03
Javaで言うところの「equals」ってC言語だと何ですか?
Javaの何のクラスのequals?
>>387 C言語には対応するものはないかな?
C++なら、状況応じて==をequals風に定義しなおすことになる。文字列とか。
Javaのように==とequalsを明確に区別することはできない。
Stringクラスのequalsならstrcmp関数だろ あくまで、文字列比較という意味でね もっとも、equalsメソッドはオブジェクトのデータの比較だから そういう意味なら、オブジェクト指向でないCにはそれに該当するものはない
memcmp (^^;
Cの場合、 構造体だと、専用の比較関数作らなきゃならんね。
Object.equalsだったら、ポインタに対する==演算子が最も当てはまる存在だな。
387です 失礼しました、説明が足りなかったようで・・・ Javaでは、([変数].equals("○○○")) と書くところを C言語だとどのように書くのかという意味です
>>395 何も読んでないのか?
クラスによってequalsの挙動は違うだろうが。
>>395 [変数]の型は何?
派生クラスでオーバーライドできるから、
クラスによって挙動が違い、Cで対応するものも異なる。
なお、Stringなら
>>391 。
398 :
デフォルトの名無しさん :2007/08/27(月) 22:48:56
ファイルのプロパティの概要で表示されるタイトルに そのファイルの拡張子を除いたファイル名を設定するプログラムを作成したいのですが どのようにすればタイトルに書き込めるのでしょうか?
>>395 if (strcmp(変数, "○○○”) == 0) ・・・
>>398 プロパティ窓を取得、拡張子まで削ってSetWindowText
401 :
398 :2007/08/27(月) 23:11:00
>>400 プロパティ窓はどのようにして取得するのでしょうか?
>>398 IPropertyStorageでググればいろいろ見付かる。
ただし、Cでやるのは面倒。少なくともC++は欲しい。
なお、この情報は、NTFSの副次ストリームに保管される。
あるいは、OLE構造化ストレージ(2003までWord/Excelファイルなど)なら
ファイル自身に保管される(このため構造化ストレージならNTFSでなくても可能)。
403 :
398 :2007/08/27(月) 23:20:09
>>402 Cでは厳しいですか・・
調べてみます
ありがとうございました
t
406 :
デフォルトの名無しさん :2007/08/29(水) 11:41:07
377です。 みなさんありがとうございます><
* 引数 :char *data : 追加したい文字列 * : int index : 追加したい位置 * : element *new_data : 新しく追加するリスト * 戻り値:成功1,失敗-1 */ int add_data(char *data, int index, ELEMENT *new_data){ ELEMENT *tmp; int cnt = 0; if(data == NULL || index < 0 || index > element_cnt || new_data == NULL){ return -1; } new_data->data = data; /* インデックスの位置の直前に移動 */ for(tmp = head;cnt != index;cnt++,tmp = tmp->next); new_data->next = tmp->next; tmp->next = new_data; printf("help\n"); return 1; } こんな感じでリスト構造にデータを入れる関数を作ったんですが、 Borlandでは正しく動くのにVisual Studioでは呼び出しもとに返らず終了してしまいます helpというプリント文は表示されます。どなたか、解決策を教えてもらえませんか? ↓がリストの構造体です typedef struct element { char *data; struct element *next; } ELEMENT;
>>407 そのソースだけだとわかんないなぁ
引数の「char *data」はその都度領域確保されているの?
それから「element_cnt」って要素数だよね?いつインクリメントしてる?
>>408 そうですよね。
>>409 さんのデバッガを調べてみます
「char *data」はただダブルコーテーションで文字列を渡すだけしてます
「element_cnt」については処理を書き込み忘れました
411 :
408 :2007/08/29(水) 21:31:46
>>407 それから追加するインデックスを0にした場合は
実際に追加されるのはインデックス1の場所にならない?
0の場合headを書き換えないとおかしくなるんじゃない?
まぁあと/* インデックスの位置の直前に移動 */ といっているけど
cnt!=index ってことはindex の位置で止まる
で
>new_data->next = tmp->next;
index+1の要素を新要素の次の要素にする
>tmp->next = new_data;
indexの次の要素を新要素にする
結局追加される場所はindex+1の場所にならない?
412 :
407 :2007/08/29(水) 21:50:13
>>411 すいません!書き忘れてましたけど、headはstatic変数で今回ダミーとして扱います
ちなみにheadはhead->next = NULLで初期化してあります。
for文の初期化でtmp = head;とあるので、head->nextでダミーではない値をもつリストに入るときにはcntは1になっています
なのでcnt == indexはひとつ前になるんじゃないかな〜と考えてます。間違えてたらすいません
413 :
408 :2007/08/29(水) 21:54:23
>>412 つまり head->next が最初の要素ってことですね
なら納得です
だとすると、やはりこのソースからだと分かりませんね
私はここまでです
414 :
407 :2007/08/29(水) 22:11:13
>>413 そうですか、ありがとうございました。
原因はこれだけのソースではわからないと思うので、ななし.orgに全部のソースをアップしました
見てくれるなら見てほしいです。んでVisualStudioで実行してほしいです
まだ途中なんでできたらツッコミとかよろしくおねがいします
415 :
408 :2007/08/29(水) 22:33:26
>>414 そういうときはURLも貼ってくれないと
ななし.orgってどこですか?
416 :
407 :2007/08/29(水) 22:43:24
417 :
408 :2007/08/29(水) 23:02:01
>>416 まずここかな
void init_list(void){
ELEMENT top;
head = ⊤
element_cnt = 0;
head->next = NULL;printf("\(^o^)/");
}
ELEMENT top; は関数のローカル変数
head = ⊤
top の実体は関数抜けたら無効になる
にも関わらず 関数外でhead(top) にアクセスしてる
418 :
407 :2007/08/29(水) 23:12:46
>>417 ああ〜!そうですねw普通におかしいですね
419 :
408 :2007/08/29(水) 23:16:02
>>418 一応こちらの環境(BCC5.5)では
>>417 を改善することで動作はします
(もう少し動作チェックしてみますが)
それから余談ですが、ポインタ配列使うなら ELEMENT next いらないんじゃないですか?
せっかくポインタ繋ぎしてるんですから add_data() 内で new_data=(ELEMENT *)malloc(sizeof(ELEMENT)) してみては?
いまは動作チェックが目的でこうしているというならゴメンナサイね
それから最後にfree()も忘れずに
420 :
407 :2007/08/29(水) 23:24:18
改善しました!
>>408 さん、ありがとうございました!
関数内でmallocはしなくて良い、と言う問題だったので、main側で確保したんです。
自分も関数内で確保した方がいいと思うのですが・・・
421 :
408 :2007/08/29(水) 23:52:07
>>420 そういうことですか
分かりました
それらが題意であるならしょうがないですね
余計なことかもしれませんが、
remove_element() は要素を削除するんですよね?
この方法(配列上で行う連結リスト)だと要素を削除した後、その後追加する際に、
空いている要素と空いていない(使われている)要素の区別がつかないので
その点も考慮していく方がよろしいかと思います
422 :
421 :2007/08/29(水) 23:53:29
#include <stdio.h> main() { static int a[5]={15,8,48,50,27} int sum,heikin,i; sum=0; for(i=0;i<5;i++){ sum=sum+a[i]; } heikin=sum/5; printf("goukei=%d\n",sum); printf("heikin=%d\n",heikin); } これにあと配列中の奇数と偶数の数を出力するのを追加したいんですが どうすればいいんでしょうか?
423 :
407 :2007/08/30(木) 00:02:53
>>421 確かにそうですね。mainの考慮をしてみます!
424 :
408 :2007/08/30(木) 00:05:50
>>422 こんなんでどうですか?
配列中の値を2で割ってあまりが出るかでないかで奇数、偶数を判断
#include <stdio.h>
main()
{
static int a[5]={15,8,48,50,27}
int sum,heikin,i;
int kisu=0,gusu=0;
sum=0;
for(i=0;i<5;i++){
sum=sum+a[i];
if(a[i]%2) kisu++;
else gusu+++
}
heikin=sum/5;
printf("goukei=%d\n",sum);
printf("heikin=%d\n",heikin);
printf("奇数 %d個 / 偶数 %d個",kisu,gusu);
}
425 :
408 :2007/08/30(木) 00:08:32
>>422 ところでなんで 421 なんですかね?
>printf("奇数 %d個 / 偶数 %d個",kisu,gusu);
改行忘れたので入れといてください
printf("奇数 %d個 / 偶数 %d個\n",kisu,gusu);
おまえも、関係ないなら名前の所の番号外せ
427 :
422 :2007/08/30(木) 00:15:18
>>425 ありがとうございます。
名前はミスして書いてしまったようです。すいません^^;
怒られちった
質問です。 例えば、データの処理(検索など)を行いながら、 同時に秒単位で経過時間を標準出力するといったようなことってできますか? できるのであれば教えていただきたいのですが。
>>429 検索のループ中に時間表示機能入れるなり、スレッド作るなり、signal使うなり
まぁ状況次第でなんなりとどーぞ。
奇数偶数なら if(a[i] & 1) //奇数 else //偶数 では?
>>431 % 2 でなにか不都合なことがあるの?
>>431 負数が2の補数表現で無い環境の場合はうまくいかないんじゃない?
(そんな環境があるかどうかは知らないが…)
問題の中に負数がないからどっちでもいいよ
>>432 もちろん論理的な不都合はないです。
ただ除算は一般に非効率なので、高速化を狙った提案。ですが、、
>>433 たしかに、そうですね。
使用可能かどうかの確認は必要だと思います。
>>435 大丈夫、まともなコンパイラなら%2を割り算では実装しないから。
437 :
435 :2007/08/31(金) 02:43:21
>>436 gcc -S で試したら、確かに論理命令が生成されてました。
しかもunsigned だと n % 1 と n & 1 は完全に同じコードに。
勉強になりました。流れ止めて失礼しました。
> n % 1 と n & 1 は完全に同じコードに バグじゃね?
バグだな
n%2の間違いだろ、突っ込んでやるなよw
実数で計算した結果の小数点以下を切り捨ててて 整数のところだけを別の計算に使いたいのです。 どのようにすればできるのかでしょうか。
>>441 一度 int にキャストする (正数のときのみ)、あるいは floor()。
入門以前のレベル。本くらい買え。
472 名前:デフォルトの名無しさん[sage] 投稿日:2007/08/31(金) 14:55:28 浮動小数点の小数点以下を簡単に取る方法ってないですか? 473 名前:デフォルトの名無しさん[sage] 投稿日:2007/08/31(金) 15:13:39 f - floor(f)
文字列とfor文についての質問です。 --出力結果-- sample01.txt sample02.txt sample03.txt sample04.txt sample05.txt ------------ 上のように出力し、かつそれぞれを格納したいのですが、 数字の部分に繰り返し文を使ってうまくやる方法がわかりません。 おしえてくらはい><
sprintf(fname, "sample%02d.txt", i);
あまりの入門レベルにワロタwww
入門篇だからいいんじゃね?
でも入門書くらい読めよ、てのが少なくない。
>>445 うまくいきそうです!ありがとうございました!!
>>429 できなくはないが、C言語入門の範疇じゃないな。
OS関連のプログラミングを勉強しないと無理。
>>444 char filename[5][100];
for (i = 0; i < 5; i++) {
sprintf(filename[i], "sample%02d.txt", i + 1);
printf("%s\n", filename[i]);
}
452 :
デフォルトの名無しさん :2007/09/01(土) 23:22:05
uintptr_t とかsize_t型ってなんなんですか これもwindowsプログラミング特有の、#defineした型なんでしょうか?
#defineはしてないと思うよ^^
size_tは標準Cに入っている記憶域の大きさを表す型、 sizeof演算子の結果の型と定められている。 uintptr_tはC99から導入された<stdint.h>で宣言されている型の1つで、 ポインタをキャストしても表現を失わないと規定されている符号無し整数型。 VC++でも最近はuintptr_t/intptr_tだけ<stdlib.h>で宣言されている。 <stdint.h>ごと入れればいいものを。 Windowsプログラムなら、uintptr_tよりUINT_PTRのほうが良く見かけるな。 こっちはWindows APIの型とされているし、 VC++にuintptr_tが入るよりも前から存在していたから。
456 :
デフォルトの名無しさん :2007/09/02(日) 00:43:43
457 :
452 :2007/09/02(日) 00:48:08
458 :
デフォルトの名無しさん :2007/09/02(日) 00:49:16
>>456 とりあえずこのサイト全部終わらせればいいんでない
459 :
デフォルトの名無しさん :2007/09/02(日) 01:12:37
Cで正規表現を自前で実装しようと思っていますが速度面で微妙 アセンブラのほうがいいですかね?
Cで速度でないなら、アセンブラでやっても大差ないと思う
>>459 grepか何かのソース読んでみるのはどーか
なにの正規表現と比べて遅いと思ったのか分からないけど、 その比較した正規表現の処理系も、おそらくCで書かれてると思われ。
Cってメモリと文字列処理がだるいよな
何をいまさら って初心者ですか そうですね
466 :
デフォルトの名無しさん :2007/09/02(日) 05:17:20
>>456 俺としては、今はもう読むこと無いけど
「C言語入門本物志向が身に付く本」;入門
「ポインタ完全制覇」:ポインタ関連
「文字列操作+ファイル入出力完全制覇」:文字通りの内容
全部「科学技術評論社」
あとは、一応K&R。入門本じゃないけど。
まぁサイトでいえばwisdomsoftかな。
他にも色々あるけど。まぁ、がんばってね
それにつけても、俺が今のレベルまでどうやって勉強してきたのか
さっぱりわからん。学びはじめの頃は
[putchar()//一文字出力する関数]なんてコメントを書きながら
ソース書いてたな。
467 :
デフォルトの名無しさん :2007/09/02(日) 06:45:53
今更Cなんてやっても・・・ CでOSや組み込み系のドライバをサクサク書けるようになるには10年はかかる やっと使えるなって感じた頃は全く需要がない恐れがある
>>467 10年もかからないよ
それに、C言語とOS、ドライバーは関係がない
ドライバをCで書くなんてえらい時代になったもんだな ってアセンブラ厨の老人が沸いてくるよ
tuhsなんか読んでるとUnixはversion 6の時代(1974)にすでにデヴァイス ドライヴァはCで書かれている。 むしろmkdirだのpasswdとかのユーザープログラムがアセンブラで書かれて たりして笑える。
version 6じゃなくてversion 5だった
472 :
456 :2007/09/02(日) 08:46:32
>>458 ,466
レス((ヾ(。・ω・)ノ☆゚+.ァリガトゥ
とりあえず今のサイト最後までがんばってみて、
終わったら466さんの紹介してくださった書籍
よんでみます^^
>>464 個人的には文字列操作はダルいけど、メモリ操作は楽。
>>469 C て高級アセンブラだよね
こんな言語で業務アプリ書くアホいないよな
って感じてた老人ならここにいますが...
475 :
デフォルトの名無しさん :2007/09/02(日) 14:22:06
>>468 あんたアフォですか?
OSを作成するためにCが作成されたのに・・・
もはや関係がないってことだろう
1000から9999までの4桁の数字で、各桁を足した数で自分を割りきれる数がいくつあるか調べるプログラムを作りました。 今回は1325という正しい答えを知っていたのでエラーに気づきましたが、答えがわからない場合はどんな風にデバッグしていますか?
全部出力して、検算する。
各桁の合計を求める部分、割り切れるかどうかを判定する部分、個数を数える部分を それぞれ個別にテストしてみる。
別のアルゴリズムで解いてみる。
481 :
デフォルトの名無しさん :2007/09/02(日) 15:36:56
>>477 そのようなプログラムをCで書かなきゃいけないか?w
excelで十分だろ
答えを知ってるってことは課題かなんかだろう
それで
>>477 みたいな疑問を持ったんだからやる価値があったってことだろう
cat.cより抜粋 /* Buffer for line numbers. An 11 digit counter may overflow within an hour on a P2/466, an 18 digit counter needs about 1000y */ #define LINE_COUNTER_BUF_LEN 20 static char line_buf[LINE_COUNTER_BUF_LEN] = { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '0', '\t', '\0' }; /* Position in `line_buf' where printing starts. This will not change unless the number of lines is larger than 999999. */ static char *line_num_print = line_buf + LINE_COUNTER_BUF_LEN - 8; /* Position of the first digit in `line_buf'. */ static char *line_num_start = line_buf + LINE_COUNTER_BUF_LEN - 3; /* Position of the last digit in `line_buf'. */ static char *line_num_end = line_buf + LINE_COUNTER_BUF_LEN - 3;
>>483 の続き
/* Compute the next line number. */
static void
next_line_num (void)
{
char *endp = line_num_end;
do
{
if ((*endp)++ < '9')
return;
*endp-- = '0';
}
while (endp >= line_num_start);
if (line_num_start > line_buf)
*--line_num_start = '1';
else
*line_buf = '>';
if (line_num_start < line_num_print)
line_num_print--;
}
Cの基本的なことを勉強して、cat.cのソースを読んでいますが
この行を計算する関数の処理が何が言いたいのかわかりません。
line_bufを参照しながらカウントしているように見えますが、いまひとつわかりません。
どなたかご教授お願いします。
行番号を表す文字列をポインタ使って変更してるんじゃない? "399" → "400"みたいに。
487 :
468 :2007/09/02(日) 18:25:16
>>475 OSを作成するためにCを勉強しているわけではないだろ
そう意味で関係ない
488 :
デフォルトの名無しさん :2007/09/02(日) 18:37:35
じゃぁ、なん為にやってるの? 文字列を逆順に表示したりするプログラムを書くためですか?hw
普通はアプリケーションを作成するためにC言語を勉強するんじゃない?
この先必要となる基礎としての勉強じゃないんですか?
>>488
英語を習うときに、目的を持つかどうかの違い棚。
492 :
デフォルトの名無しさん :2007/09/02(日) 19:06:28
失礼します。 変数Aに一秒ごとに1を追加していくようにしたいのですが、どうしたらいいのでしょうか。
どうしてそんなことをする必要があるのかってところから考えたほうがいいよ。
494 :
デフォルトの名無しさん :2007/09/02(日) 19:09:41
>>492 main()
{
int A = 0;
while (1) {
sleep(1);
A++;
}
}
496 :
デフォルトの名無しさん :2007/09/02(日) 19:16:24
>>492 つ time.h
使った事無いけど…orz
CでMMOのBOT作れるんでしょうか?
いいえ
タイマーの値が必要なときに、現在時刻を取得すればいいんじゃない? 時刻の取得の仕方は環境依存
500 :
デフォルトの名無しさん :2007/09/02(日) 19:35:31
501 :
487 :2007/09/02(日) 20:03:34
>>488 > 文字列を逆順に表示したりするプログラムを書くためですか?hw
なかなかよいポイントをついているね
プログラミングの本質はデータの加工と入出力
世の中のすべてのプログラムは「文字列を逆順に表示したりするプログラム」
データーベースのアプリだって通信モジュールだって高度な科学技術計算のプログラムだって
みーんな本質的には「文字列を逆順に表示したりするプログラム」だ
OSもね
もっと軽い言語がたくさんありますよ今は
例えば何?
504 :
デフォルトの名無しさん :2007/09/03(月) 23:10:59
>>503 スクリプト系の言語のことをいってんじゃないの?
スクリプト系はゲロ重だろ
int main(void) { do { switch (getnum("番号を入力してください\n")) { case 1: question(1); break; } } while (0); return 0; } int getnum(const char *msg) { int n; for (printf(msg); scanf("%d", &n) != 1;) { while (getchar() != '\n'); } return n; } ここで使われているgetnumがいまいち理解できません。 何をしてるいるのか教えてください。
printf(msg) は msg を表示 scanf("%d", &n) は数字を入力 != 1 は scanf で数字が正しく入力されたか確認 while (getchar() != '\n'); は改行が来るまで入力を読み飛ばす return n; は入力された数字を返す これでおk?
509 :
507 :2007/09/04(火) 18:40:35
>>508 さん
よくわかりました。
ありがとうございます。
意味がわからない変数名はやめろ
continueやめてbreakにすれば?
>>510 > 第二に40行目の部分のコメントをはずしたときに
> 47行目を切り取り、49行目の後に記述すると結果が変わるのはなぜですか?
コンパイラのバグだと思われる。
>>510 >>512 も言っているけどswitch内のcontinueやめてbreakにするとこうなる
+---+
| |
+---+
| |
+---+
>>510 確認してないけどたぶんあれね
continueにしちゃっているから44行目からwhile()の式評価にとんじゃっているんだと思う
実際には47〜49行目は実行されていない
本来は47行目に行かなきゃ行けないのでbreakにする
32行目を下のように変更するだけで動作が変わるから、バグでしょ while (d < e){ ↓ while (d < e){printf("");
gcc は期待したとおりの動作になったが
bcc だと
>>516 の変更前後で出力内容が変化した
変更前
+---+
変更後
+---+
| |
+---+
| |
+---+
あっwhile (d < e)があったの気づかんかった
とりあえず
>>515 は忘れて
>>514 は目的の動作が分からんので保留かな
519 :
510 :2007/09/05(水) 18:42:26
皆さん見ていただきありがとうございました。
continueで戻ることばかり考えていてbreakを忘れていました、
while文の中にあるのでcontinueを使わずとも繰り返しになるのですね、
whileとbreakとcontinueの使い方を再確認します。
変数名も以後気をつけます。
コンパイラのバグということで
他のコンパイラを試してみようと思っていたのですが
>>517 さん試していただきありがとうございました。
>>519 switch があるから、breakはそっちを抜けるだけで
whileにまで影響しないんだよ
switchとwhileが同じbreakなのは
たまに不便だがな
まぁそういう時は多少見辛くてもif-else使うかな。俺は。 ループフラグとかgotoとかキラーイ
522 :
デフォルトの名無しさん :2007/09/06(木) 02:48:24
struct node *hoge(struct node* a)
{
struct node *b;
b = a;
a = NULL;
free( b );
return a;
}
free関数の形式を調べてみるとvoid free(void *ptr);と書いてありました
ttp://www.bohyoh.com/CandCPP/C/Library/free.html つまり、上記の関数を実行すると、引き数で渡されたポインタaがNULLを代入される前に指していた領域を開できるということでしょうか?
自分で調べてみて「たぶんあっているな。」とは思ってもどうしても確信できなくて不安になってしまいます。みなさんはそんなことありませんでしたか?(このレス二つ目の疑問です)
523 :
デフォルトの名無しさん :2007/09/06(木) 04:23:10
適当な結果を標準出力に出力しつつ時々 y/n を聞いてくるコマンド ques が あったとします。y/n を検知して 代わりに y を入力してくれる プログラムを書きたいのですが、 何をキーワードに検索してよいのか すらわかりません。パイプで検索したのですが 何か違う感じでした。 よろしくお願いします。
>>522 ・できる。
・根本的にポインタを理解できていればそんなことはないと思う。
>>523 他に標準入力する項目がなく、quesが確実に標準入力を利用しているというのなら、
yes | ques
でOK。
525 :
デフォルトの名無しさん :2007/09/06(木) 10:22:16
>>524 すいません。C言語でやりたいのです。
それと質問に応じて no と答える場面もあります。
よろしくお願いします。
>>525 それなら、パイプで間違ってないと思う。
コマンドの標準出力/標準エラー出力を監視しながら特定のパターンを認識したら、
コマンドの標準入力に対して、yまたはnを投げる。
>何か違う感じでした。
何を期待しているか知らないが、コンソールアプリでは
WindowsのGUIアプリのように、入力待ちになったとかのイベントが
飛んできて、そこに処理を記述するわけではない。
実装はどうしても泥臭くなると思うが。
ファイル操作について質問なのですが、 もし現在の日付をfprintf("%d %d %d %d %d %d\n",local->tm_year・・・以下略 こういう風にファイルに保存したとしますよね。 このファイルを読み込むとき、 fscanf("%d%d%d%d%d%d",&year,・・・以下略という風に読み込んだとき、 何故yearという変数にはしっかりとyearで保存した数字が格納されるのですか? 説明下手ですみません。
fprintf("%d %d %d %d %d %d\n",local->tm_year・・・ で書き込むと当然、 2007 09 06 ・・・ となるから、fscanf("%d%d%d%d%d%d",&year,・・・で読み込むときは 空白か改行まで読まれるので 2007 09 06 ・・・ と順に読み込まれる
なぜって言われても、それが fscanf という関数の機能なんだし。 どういう結果になると思ってた?
なるほど・・・左上から順に変数に格納されるんですね。それなら呼び出す 順番に気をつけないとメチャクチャになりますね。分かって良かった。 ありがとうございました。
531 :
:2007/09/06(木) 16:45:10
すいません。gccの拡張命令について知りたいのですが どこかに命令一覧が載ってるサイトってありますか?
配列を引数として関数にいれて、関数でその配列の中身を表示しておいて mainでその関数を100回くらいまわしたら 値がかわってくるんだけど何が原因だと思われますか? 配列は20要素で 引数は4つ使ってます。
>>532 そりゃプログラムのバグでしょ
具体的にコード見せてくれないとそれ以上はわからん
void makemake(---){ (これをmainと思ってください) double ma[120][20]; double h1[20],h2[20],n[120]; int num; fileinput(h1,h2,num); for(i=0;i<120;i++){ n[i]=fmake(ma[i],h1,h2,num); } } そしてfmake関数に渡します double fmake(double a[20],double b1[20],double b2[20],int n){ int i; for(i=0;i<20;i++){ printf("b1:%lf b2:%lf",b1[i],b2[i]); } } まー一部なんでわかりにくいかもしれませんが。 fmake関数のprintfで20ループくらいまでは きちんと表示されるんですけど途中でnanとかおかしな数字が表示されるんです。
not a number
536 :
532 :2007/09/06(木) 17:13:30
534ですけどお願いします。
そのファイルがおかしいんじゃないの
>>536 思わず笑ってしまった。
>>535 の not a number は
>>534 の nan を指してる。
NaN (Not a number)、日本語だと非数。
浮動小数点演算で、0除算など計算結果が正しく求められない計算を
したときに、値が正常でないことを示す特別な値が格納される。その値のこと。
繰り返しはまったく同じものを表示しているわけではないみたいだけど、
fileinputで読んできた値がすでにおかしいんじゃないの?
>>534 fileinput をでっちあげて動かしてみたが、まったく問題ない。
省略した部分がおかしいと思われ。
540 :
532 :2007/09/06(木) 17:46:27
ファイル入力が間違ってるんじゃないかって指摘するってことは プログラムはあってるってことですか ありがとうございます。 どうしようもなくなったら直接fmakeにb1,b2のファイルいれますわ。
>>540 プログラムもなにも、挙げられた断片だけでは何もしないコードに見え
る。fmake()は何も返してないし。
542 :
532 :2007/09/06(木) 17:53:22
正規分布のプログラムなんすよ。 double a[20], データ120X20 double b1[20], 20次元の平均 double b2[20], 20次元の分散 int n 平均・分散の組。 式は書くの大変だから省いてるだけです。
予想ではたぶんその式が悪い
544 :
532 :2007/09/06(木) 18:04:15
double fmake(double a[20],double b1[20],double b2[20],int n){ int i; for(i=0;i<20;i++){ printf("b1:%lf b2:%lf",b1[i],b2[i]); } 以上
わからなければ計算したり配列弄るごとに中身出力してみ
どこが悪いかわかんないのに、なんでそこが悪いと思うのか理解できない。
547 :
デフォルトの名無しさん :2007/09/06(木) 19:15:12
548 :
532 :2007/09/06(木) 19:33:26
>>532 て書いてるんですけど。
式はあってるんだよ確認ずみだから。
入力のプログラムがあやふやだからここで聞いただけ。
はいはい。コンパイラのバグかなんかじゃねえの。
そろそろ荒らし化しそうな予感
こんなアホ相手にするお前ら優しいな
よく言われる
>>547 配列の宣言の仕方とsizeの扱い直せばいけると思う
>>553 追加でコンパイルするだけならsizeはそのままでもいいかも
連投スマン
どんどん本性が出てきたな
>>510 が、もう見てないだろうから、書いてみる
#include<stdio.h>
int main(void){
int x, y, width=3, height=4;
for(y=0;;y++){
for(x=0;x<width;x++) printf("+---");
printf("+\n");
if(y>=height) break;
for(x=0;x<width;x++) printf("| "" "" "); // コピペ用
printf("|\n");
}
return 0;
}
殆どのネットゲームのBOTは C言語で開発されてるんでしょうか? サイトありましたらおしえてください m)_ _m)
無い
ネトゲのBots全てがCで作成されているかは知らんが Cで作成できないことはない。 まぁ開発にあたっては、Cの知識だけでなく、それ以上の多くの知識が求められます。
UWSCあたりならすぐに書けそうだな。
関数は自分で積極的に作ったほうがいいですか? それとも既存のものの効率的な組み合わせにこだわったほうがいいですか?
既存のものの効率的な組み合わせをする関数を自分で積極的に作ったほうがいい
>>564 ありがとうございます。なるほど!積極的に作ります
グローバル変数として宣言する場合と、staticを付けて関数内で宣言する場合は どういう違いがあるんでしょう?いくつかの説明文見たところ自分では同じように 思えるんですが、グローバル変数にstaticを付けるプログラムの例を見かけたので気になりました。
static を付けないグローバル変数 → 他のファイルからでも参照できる static を付けたグローバル変数 → 他のファイルからは参照できないが、同じソースファイル内ならどの関数からでも参照できる static を付けた関数内の変数 → 他の関数からは参照できない 間違って書き換えたりしないように、見える範囲をなるべく最小限にする方が良い。
>>567 ありがとうございます、アクセスできる範囲に違いがあるんですね。
つい値を保持できる期間ばかりに目が言ってたみたいです
569 :
デフォルトの名無しさん :2007/09/07(金) 23:03:28
入力された文字列が正しい文字列かを判断するプログラムなんですけど #include <stdio.h> #include <string.h> int getflg(char wd); main() { int n; char word; printf("文字入力:"); scanf("%s",&word); n=getflg(word); printf("flg=%d",n); } int getflg(char wd) { int flg=0; if ( strcmp(wd,"あいうえお")==0 ){ flg=1; } return flg; } これだとエラーがでるのですがどうすればよいのでしょうか;;
>char word; >printf("文字入力:"); >scanf("%s",&word); え?w
>>569 「文字」ではなく「文字列」だから
#include <stdio.h>
#include <string.h>
int getflg(char *wd);
main()
{
int n;
char word[20];
printf("文字入力:");
scanf("%s",word);
n=getflg(word);
printf("flg=%d",n);
}
int getflg(char *wd)
{
int flg=0;
if ( strcmp(wd,"あいうえお")==0 ){
flg=1;
}
return flg;
}
だね
572 :
569 :2007/09/07(金) 23:13:04
>>570 すいません
>>571 文字だと&が必要で
文字列だと&は必要ないということですかね?
あと*wdにするのはなんでですかね?汗
>>572 >文字列だと&は必要ないということですかね?
必要ない
>scanf("%s",word);
>if ( strcmp(wd,"あいうえお")==0 )
文字列同士の比較をしたいわけでしょ
char wd だと1文字だけしか渡せない、文字列として渡したいならポインタとして渡すしかない
char *wd は文字列のポインタを渡している
#include <stdio.h> #include <string.h> int getflg(char *wd); main() { int n; char word[20]; printf("文字入力:"); scanf("%s",word); n=getflg(word); printf("flg=%d",n); } int getflg(char *wd) { return !strcmp(wd,"あいうえお") ? 1 : 0; }
>>534 > double ma[120][20];
これでスタックフレームを何byte消費しているか理解しているか?
static double ma[120][20];
static double h1[20]
static double h2[20]
static double n[120];
にしてみろ
これで結果がお前の予想通りになったなら
コンパイラはお前の予想通りには動かないということを知っておけ
576 :
569 :2007/09/07(金) 23:35:04
>>573 char wdだと1文字だけなんですか?
>>575 > これでスタックフレームを何byte消費しているか理解しているか?
たった、18,9Kじゃん。
578 :
569 :2007/09/07(金) 23:47:17
>>576 をちと言い換えたいんですが、
int getflg(char wd[])
と違いは何かありますか??
>>578 int getflg(char wd[]);
と
int getflg(char wd);
の違いが理解できない奴はCをする資格が無い
VBかJavaScriptあたりで妥協しておくことをお勧めする
理解できないっていうか、こういう基本的なところをネットで訊きながら進めるのって、効率悪すぎだろ。 入門書でも買えばいいのに。
Cでは文字列変数というのはなくてバイト(char)の配列として扱っているんだよね ほかの言語ではまずありえないことだけど
582 :
569 :2007/09/08(土) 00:33:22
>>580 基礎的なHPをいろいろ探してみてきたが
int getflg(char *wd);
これだと、ポインタによる引渡しで
int getflg(char wd[]);
これだと、wdに文字列を直接代入する的なものですか?
haskellもそうじゃなかったっけ
>>582 いや、ややこしいことに
int getflg(char *wd);
と
int getflg(char wd[]);
は同じ
586 :
581 :2007/09/08(土) 00:38:56
>>582 ちがいます
Cではchar wd[]とchar *wdはほぼ同じ扱いです
587 :
:2007/09/08(土) 00:41:32
でも配列とポインタだと&かましたときの値が違うんじゃないの?
関数の宣言で使用する場合は同じ(ポインタと解釈)。
>>586 ちがいます
Cでは関数の引き数の宣言において、char wd[]とchar * wdは全く同じ扱いです。
char wd[10] とか書くとまた変わって来るからややこしい。
int getflg(char *wd); も int getflg(char wd[]); も int getflg(char wd[10]); も int getflg(char wd[42]); も一緒
592 :
デフォルトの名無しさん :2007/09/08(土) 02:30:12
すみません、質問です。C言語でmallocによる動的な領域確保の勉強をしています。 char型の領域を動的に確保してそこにコマンドライン引数のargv[i]を格納していきます。 void main(int argc, char *argv[]){ int i; char *hikisu; for(i=0; i<argc; i++){ hikisu[i] = (char *)malloc(sizeof(char)); memset(hikisu[i], NULL, sizeof(char)); strcpy(hikisuu[i], argv[i]); } } これでコンパイルが通らないのですが、何が悪いのかよくわかりません。 ご教授お願いします。
>>592 動的確保以前のポインタの勉強をしなおせ。
--
// インクルードファイルを適切にインクルードしていない
void main(int argc, char *argv[]){
// mainの戻り値型はintにするべき
// 中括弧は別の行に書くのが一般的
int i;
// 一文字変数はインクリメンタルサーチしにくいからお勧めしない
char *hikisu;
// ポインタ変数は、ポインタ一個しか保持できない。引き数を複数保持したいなら、これではダメ
for(i=0; i<argc; i++){
hikisu[i] = (char *)malloc(sizeof(char));
// malloc()の引き数はバイト数。これでは1バイトしか確保できない
memset(hikisu[i], NULL, sizeof(char));
// malloc()したエリアをmemset()で潰してしまうのはナンセンス(一部に妄信者はいるが)
// つーか、引き数が無茶苦茶
strcpy(hikisuu[i], argv[i]);
// これも引き数が間違っている
}
}
--
まぁ、取り敢えずこの辺にしておいてやるかw
>>592 stdlib.hがincludeされてない。
strcpy(hikisuu[i], argv[i]);
「hikisuu」はどっから出てきた?(タイプミス?)
この2つ直すととりあえずコンパイルは通るかもしれない。(コンパイラ次第)
が、落ちる可能性が高いな。
ていうかコンパイルのエラーを書け。
Javaにはメソッドのコメントの書き方で、 /** @param @return */ のようなのが決まっていて、これでHTMLのドキュメントを自動作成できますが、 Cにはそのようなものはありますか?
つ[Doxygen]
597 :
595 :2007/09/08(土) 21:25:58
レスありがとうございます。 できるだけ標準的なものを使いたいのですが、そのDoxygenというのはよく使われていますか? もしJISやISOやその他の標準化団体の制定した書式があるようならば、教えて欲しいのですが。
標準化はされてない デファクトスタンダードには近いかも
599 :
デフォルトの名無しさん :2007/09/08(土) 23:08:08
戻り値で成功か失敗かの判定だけ必要なとき、 成功は0で、失敗は-1で返すのがいいんでしょうか? 古いCの関数はこれが多いですよね。 成功は1で失敗は0にすると、判定側でif(!func()){ printf("error"); } のような書き方ができるので、これの方が便利な気もするのですが、 どっちがいいんでしょうか。
>>599 古いCの関数っていうか、unixのシステムコールだろ。
>>599 俺は自分でSUCCESSとFAILUREをdefineして使うのが好き。
SUCCESSが1でも0でもif(func!=SUCCESS)と書く。
この辺は好みじゃね?
シンプルに0か0以外がいいよ。 いろいろ値が定義してあると、読むのに負担がかかる。 単純なTRUE,FALSEでも、0以外と0になっているかとか、定義が一箇所かとか気にする必要あるし。 いまやってる仕事なんて、RTN_OKとRTN_ERRだけかと思ってたら、RTN_NODATAとか返してたり返した無かったり するし。
603 :
デフォルトの名無しさん :2007/09/08(土) 23:55:20
あるディレクトリにある、大量のファイル(ファイル名は***1.dat、***2.dat、***3.datと1000個ぐらい続く) を順番に読み込みたいのですが、どのようにすれば良いのでしょうか? 通常のファイルを開く方法(fopen)では、指定ファイル名をしてforループで回して変更するとかいう事が出来ない みたいなので困っています。どなたかご教授よろしくお願い致します。
普通に一個ずつ順番に読めばいいんじゃないの?
>>603 OSのAPIに頼ってディレクトリのファイル名一覧を作る。
で、順番にfopenか何かで開く。
606 :
デフォルトの名無しさん :2007/09/08(土) 23:58:49
ファイルシステムを直接読めばいいのでは?
ファイル名が連番になってるのならforループで舞わせばいいい。
608 :
デフォルトの名無しさん :2007/09/09(日) 00:00:30
つ system
>>603 ファイル名が規則的なら、、ループで回して処理できるよ。
610 :
デフォルトの名無しさん :2007/09/09(日) 00:10:34
age
***1.dat、***2.dat、***3.dat てことは連番だな
int i; FILE *fp; char filename[12]; for (i = 1; i <= 1000; i++) { sprintf(filename, "***%d.dat", i); fp = fopen(filename, "r"); 以下略
613 :
603 :2007/09/09(日) 00:50:17
>>612 様
どうもありがとうございます。
sprintfという関数を知りませんでした。
非常に助かりました。
614 :
デフォルトの名無しさん :2007/09/09(日) 12:21:33
すみません 初心者です。 この最後のFor文は何をしているのですか? よろしくお願いします。 int wk1; char DateT[10+1]; char bufs[128]; DateT[0] = "2007/10/01" memset( bufs, 0x0, sizeof(bufs) ); memcpy( bufs, DateT+ 5, 2 ); wk1= atoi(bufs); wk1-= 1; for( i=6; i>=5; i--, wk1/=10 ) DateT[i]= (char)((wk1%10)+'0');
10 月を 09 月に変えてるんじゃね?
616 :
デフォルトの名無しさん :2007/09/09(日) 12:33:45
月の値、01〜12を00〜11に置き換えている。
>614 とりあえずそのコード、コンパイル通らなくない? 質問するくらいだから自分で書いたコードじゃないんだろうけど、あんまり参考にしたくないコードだと思う。 で、for 文限定だと 短い答え:数値を文字列に変換している。 もうちょっと長い答え: wk1 % 10 で wk1 の一の位の数値を得る。 これに '0' ('0' の文字コード値を足すと 0 なら '0' に 1 なら '1' と数値→文字の変換が出来る。 wk1 /= 10 で十の位が一の位に移って繰り返し。
>>614 ?? DataT[0] = "2007/10/01"
そいつは、通らねえよ。
それにしても、俺の現場にあるソースに似てるwまさかww
619 :
sage :2007/09/09(日) 13:47:36
>>615 様
>>616 様
>>617 様
>>618 様
どうもありがとうございました。助かりました。
私の知り合いが解析しているソースを
出来ないなりに私も手伝おうかと思って頭から調べているときに
ひっかかった次第です。
自分はもう少しCの勉強が必要ですね。orz
恥ずかしいんでsageます。 失礼しました。
2chのスレッドの仕組みについても学んでください sageで書き込んでもスレッドは下がりません
いまリストでキューを実現しようと考えてるのですが、うまくデータを入れることができません
どうすれば改善できるか見てもらえないでしょうか?
http://www.dotup.org/ C言語ってコメント入れているファイルです
普通、キューに入れるときに動的にメモリ確保するんでない?
>>622 根本的に改善する余地あり
改善案は次の通り(命名に付いては適当に変えたほうが良い)
QUE *queue_init(void);
void queue_terminate(QUE *que);
int queue_enque(QUE *que, void *data);
void *queue_deque(QUE *que);
int queue_size(QUE *que);
キューのデータそのものと頭とケツの位置とかを保持する管理構造体を作って、それをQUE構造体とすべき
626 :
622 :2007/09/09(日) 22:17:55
>>623 確かにそうですね。とりあえず今回はって事で書きました
>>623 queue_terminateはどういう処理をしますか?
>>625 そうします
>>624 じゃないが、
QUE *queue_init(void); → QUE型のメモリ割り当て、初期化
void queue_terminate(QUE *que); → 保持しているキューデータのメモリ解放、QUE型をメモリ解放
だと思う。まぁC++のあれだよね^^
628 :
622 :2007/09/09(日) 22:42:24
>>627 そういう事ですか、わかりました
根本的な改善はわかったんですが、今回のデータを入れることができないっていう事の
改善策はありませんか?
また次も同じことになりかねないので・・・
構造が悪いから分かりにくくなってるだけ
引数チェックが甘かった orz まあいっか
632 :
622 :2007/09/09(日) 23:15:53
>>629 拝見しました。管理用とデータ用の構造体を作ったほうがいいことがよくわかりました
参考にさせてもらいます。ありがとうございます〜
634 :
デフォルトの名無しさん :2007/09/10(月) 13:51:08
西暦と月を入力すると,以下のようなカレンダーを出力するプログラムを作成せよ 閏年にも対応すること. 西暦年が4で割り切れる年は閏年 ただし、西暦年が100で割り切れる年は平年 ただし、西暦年が400で割り切れる年は閏年 指定された年,月の一日の曜日を求めると良い.曜日を求めるには,Zellerの公式を使う.年も月も整数型の変数を用い,日の部分は1に置き換えること. (年+年/4-年/100+年/400+(13*月+8)/5+日 )%7 1月と2月は前年の13月,14月として考える. この式の答えと曜日の関係は以下の通り. 0:日曜日,1:月曜日,2:火曜日....,6:土曜日 Sun Mon Tue Wed Thu Fri Sat 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 このようなプログラムを作りたいのですがちんぷんかんぷんでまったくできません。 よろしければ見本のようなものを作ってもらえないでしょうか。 お願いします。
丸投げは宿題スレ
636 :
デフォルトの名無しさん :2007/09/10(月) 14:01:37
すれ違い申し訳ありませんでした。
637 :
デフォルトの名無しさん :2007/09/10(月) 14:04:46
Cで構造体を初期化するとき {0}を代入するのと、memsetで0をセットすることの違いはなんでしょうか? typedef struct tagAAA { int a; int b; int c; } AAA, * PAAA; AAA aaa1 = {0}; AAA aaa2; memset(&aaa2, 0, sizeof(AAA)); おしえてください。
浮動小数点型やポインタ型のビット表現がゼロとは限らない
>>638 memsetでもそれは同じではないの?
両方、構造体のサイズ分、0 でクリアされるとおもってるんだけど。
>>637 memsetで0をセットは百害あって一利なし。使わないほうがよい。
構造体を初期化したいときには、各々の構造体メンバー変数に対し、
決められた初期変数を代入すること。
memsetが唯一有効なのは、メモリーをバイナリーエディッターで除くとき。
反論↓↓↓
>>639 doubleの0x00000000は0.0と保障されているわけではない。
ということでしょ。
えーと↑↑↑ エディッターのあたりがよくわからない
初期化でBYTEレベルでALL 0 にしたい場合は、 = {0} での初期化と、 memset での初期化の違いはあるの? @ AAA aaa1 = {0}; A AAA aaa2; memset(&aaa2, 0, sizeof(AAA)); は同じことをしているのかということです。
構造体は知らないけど、配列の場合はコンパイルすると同じコードになるって前にみかけた気がする。
>>643 コンパイラによっては、{0}の方が、より最適化される可能性が高い。
>643 @ graceful A rude
647 :
デフォルトの名無しさん :2007/09/10(月) 15:58:29
指定の行の削除方法が分かりません 例えば下記のようなファイルがあり あいう あああ いいい ううう これを「いいい」だけ削除して下記のようにしたいのですが、1行だけ削除するようなやり方がわかりません あいう あああ ううう やりかたをご教授いただけないでしょうか
サンプルとかみても memset のほうがおおい。 AAA aaa1 = {0}; とかで構造体を初期化しているのってほとんどみないような。
>>648 なんで、構造体を初期化する必要があるの?
構造体メンバーを初期化する必要はあると思うが、構造体全体の初期化はあまり意味がないだろう。
そもそも、初期値が0とは限らない。
windows api つかうときってmemsetで初期化することあるでしょ。 CRITICALSECTIONとか、RECTとか。いちいちメンバごとに初期値いれるソースとかみたことないよ。 いったん初期化してから個別に値いれることはあるけど。
@ AAA aaa1 = {0}; A AAA aaa1; memset(&aaa1, 0, sizeof(AAA)); @=A FA?
={0} は浮動小数点やポインタも正しく 0.0 や NULL に初期化される。 memset で全ビットを 0 にする方法では、処理系によっては浮動小数点やポインタが 0.0 や NULL にならない場合がある。 @≠A
>>647 改行コードで区切って、消す行の後を違う領域に分けた後、消す行のところに繋げる
memsetで初期化のクセを覚えてしまうと、 C++のクラスのオブジェクトに対してもそれをやりそう。
コンストラクタがまさかのmemset呼び?
>>657 うちの連中ならやりそうだw
ところで、
>>637 のは
AAAA aaa1 = {}; //{0}の0省略
はできないの?C++の本に乗ってたんだけど、Cでも試したら出来てそうなんだけど。
>>658 エラー E2264 式が必要といわれた
@BCC5.5
>>658 ANSI C的には文法違反。
{}の中には少なくとも一つの式がいる。
662 :
658 :2007/09/10(月) 22:42:45
Cを無料でダウンロード出来るトコなんてないですかそうですか やっぱり電気屋とかで買うんですかね?
てめぇ〜〜〜ら、一生に一度の俺の質問に答えてくれ! どうしてC言語の勉強を始めたの?
日本語を無料でダウンロード出来るトコなんてないですかそうですか やっぱり日本とかで買うんですかね?
666 :
663 :2007/09/10(月) 23:11:01
>>667 遊びというのは個人的な理由。ではなぜ C言語を選んだ かの理由は???
>>667 君、そういうことを言ってしまうと、自分にとって遊びだからという理由で
なぜその遊びを選んだかの理由は関係ないじゃ〜〜んって無責任な人間になってしまうよ?
なぜなら、殺人を遊びに選んだら、なぜ殺人をしたんですか?という質問に対して
君は常に「遊びだから」という身勝手な言い訳をし続けることになるから。
身勝手かどうかは主観に依存するよな。
>>670 殺人を遊びという理由は身勝手。なんで殺人をしてしまったのか?
という理由が述べられていない。ただの愉快犯なら情状酌量の余地なし。
すぐさま死刑で良いでしょうw
>>670 要するにお前は理由もなくC言語をやっていたんだ。まぁあれだろ
通っていた学校でやらされた程度で、実は面白くないと?w
同意。身勝手かどうかを判断する客観的な主体は存在し得ない。 深読みしてみると質問の趣旨は、なぜ数あるプログラミング言語の中から Cを選んだのか?ってことなんかな。つか複数使える人のほうが多いと思うがね。
>>664 単位取得に必要だったからやった
今も後悔はしていない
まぁ、普通に答えると始めたきっかけは高校でやらされたからに他ならない。
何も知らないころよく聞く言語名がCだったから、かなぁ
>>664 きっかけは、情報処理技術者試験のためデス。
学校でFORTRAN習ったけど、当時自宅のMS-DOS環境で開発環境を入手できたのがCだった。
>>664 最初は高校でやったMS-BASIC(だったか?)によってプログラミングが楽しくなり
学校においてあった8ビットCPUのポケコンをさわり、欲しくなったので先生に頼んで取り寄せ、16ビットCPUのポケコンを購入
インタプリタで動作するCが組み込まれていてBASICより面白いと思う
大学で自分のPCを買えるようになってコンパイラ方式のCをはじめる
>>673 遊びこそ主観だろ、答えたくないバカは黙ってろよ。歩インポイントでお前を
名指しして質問されているわけじゃないだろ?w お前みたいな基地外にはむしろ聞いてないって。
それから、何が主観かなんてどうでも良いんだよ。理由がいえないなら黙ってろ
うひょっ、わけわからない入力をしてたw 歩インポイント > お前にピンポイント
動的に確保した領域の大きさってどうやったらわかりますか?
>>667 全員が全員、遊びでC言語をやっているわけじゃないと思うんだが?
勝手にC言語=遊びみたいなことを言うなよw
お前の場合は遊びに理由がって関係ない話をしているだけ。
お前にとっては遊びで始めたというのが理由であって、C言語は遊びじゃないぞ。
自転車置き(ry
int *a; のとき、 aはポインタのアドレス *aはポインタに格納された値 なんですよね? じゃあ &aだと何を表すんですか?
>aはポインタのアドレス いいえ
じゃあなによ?
aはポインタ型の変数 また、&aはaという変数へのポインタ
ポインタ
>>687 *aはポインタが指し示すオブジェクト。とでもいった方がよいかな。
値といっても=の左辺になれる事を理解すること。
aは、int型のオブジェクトのアドレスを格納するポインタ型の変数=ポインタ。 *aはポインタが指し示すオブジェクト。 &aで、int型のポインタ変数aのアドレスを参照できる。 int a = 10; int *p; p = &a; printf("aのアドレスは%p\n", p); printf("aのアドレスは%p\n", &a); printf("aの値は%d\n", *p); printf("aのポインタのアドレスは%p\n", &p); これであってますか?
おk
>>695 *p = 20;
などの操作をして、aの値を確認してみるのも良い。
696 :
695 :2007/09/11(火) 01:28:16
697 :
687 :2007/09/11(火) 01:39:59
なるほどよくわかりました ありがd
コンパイラがVisual C++ 2005 Express Edisionでstring,hが開けないって出るんだけど何ででしょう? 定義は#include <string,h>って書いてるんですけど他に何か設定しないとダメですか?
string,hじゃなくてstring.hじゃないか?
×string,h ○string.h というオチじゃないだろうな?
701 :
698 :2007/09/11(火) 03:02:51
そ れ だ メモに貼り付けてフォント変えたら違いが判った ありがとう!
>>680 > 16ビットCPUのポケコンを購入
> インタプリタで動作するCが組み込まれていて
メーカー教えて
文字配列とポインタで質問です char *str[]={”山田”、”井之上”、”御手洗”、”鈴木”}; とした場合 配列は char str[0][0]="山", str[0][1]="田", str[0][2]="\0", str[0][3]="\0" str[1][0]="井", str[1][1]="之", str[1][2]="上", str[1][3]="\0" str[2][0]="御", str[2][1]="手", str[2][2]="洗", str[2][3]="\0" str[3][0]="鈴", str[3][1]="木", str[3][2]="\0", str[3][3]="\0" str[4][0]="\0", str[4][1]="\0", str[4][2]="\0", str[3][3]="\0" と自動で入って各行の配列の先頭のアドレスが*str[1]や*str[2]に入ってるんでしょうか
いいえ
という事は > char *str[]={”山田”、”井之上”、”御手洗”、”鈴木”}; これはどういう状態でしょう?
文法エラーの状態です
本に載ってる型の定義をそのまま写してみたんですがorz ちょっとそのまま書いてみて試してみます
全角/半角、クォーテーション/ダブルクォーテーションに注意
char *str[]={"山田","井之上","御手洗","鈴木"}; 文法ってそっちでしたかorz これでよろしいですか?
ちょっと眠気で頭が鈍くなってきたけど 山田、井之上、御手洗、鈴木はそれぞれメモリのどこかに書き込んで *str[0]〜[3]にはメモリのそれぞれの文字列の先頭アドレスが入ってるってことかな
>>710 str[0]〜[3]にはメモリのそれぞれの文字列の先頭アドレスが入ってるってこと
だと思うよ
あぁそっか*をつけるとアドレス先の中身だっけ まだ微妙に疑問点あるけどひとまず寝ます 頭が動いてないorz ありがとう
713 :
デフォルトの名無しさん :2007/09/11(火) 13:47:31
文字列の質問です。 1から100の自然数を”1”から”100”という文字列に変換せよ って問題ですけど、どんなプログラムになりますか?
for文で回してsprintf使うとか。
715 :
デフォルトの名無しさん :2007/09/11(火) 14:16:56
char** func() { int i,j = 0; char *cp[100]={'\0'}; for(i = 0; i < 100; i++) cp[i] = ( char *)malloc(sizeof(char)*4); for(j = 0,i = 1; i <= 100; i++,j++) sprintf(cp[j],"%d",i); return cp; }
そりゃないだろw
718 :
デフォルトの名無しさん :2007/09/11(火) 15:50:26
>>715 さっきは適当に書いて張りました
以下ソース
char** func(char **cp, size_t n)
{
int i,j = 0;
for(i = 0; i < n; i++)
cp[i] = ( char *)malloc(sizeof(char)*4);
for(j = 0,i = 1; i <= 100; i++,j++)
sprintf(cp[j],"%d ",i);
return cp;
}
for(i = 0; i < 100; i++) sprintf(cp[i],"%d ",i+1); これでいいじゃん
>>718 nが配列のサイズならループの最大値100にすんな
引数で渡してる奴を戻り値にすんな
ポインタの100個の配列もmallocすればいいのだ でも質問者は完全版を求めてるの?
722 :
718 :2007/09/11(火) 16:29:51
>>720 たしかにそうだね
オナニーしようかしまいか迷ってる最中に
書き込んだクソソースなんで
あんま吟味しないでね
何かアプリケーションを作ろうと思ったらCとC++どっちがいい?
伺系アプリの間違いだと信じたい
>>702 また難儀な・・・
押入れから引っ張り出してきたよ
あ〜なつかしぃい
CASIO PERSONAL COMPUTER FX-890P 16-bit CPU
(液晶の枠部分に書かれている文字)
しかもこれ専用(?)のフロッピーディスクドライブ&そして(確か)増設メモリまで買ってしまったはず
起動したらまだ動く(リチウム電池は空)
(スレチスマソ)
>>725 姉妹品?のZ-1ならもってた
捨てちゃったけど
bcc32を使っているのですが、c言語のソースプログラムのファイル名に、 list1-1.cのように「-」を使ってもいいのでしょうか?
いいよ
>>723 C++のほうがお勧めかな。
理由
C++を勉強すると、Cも勉強できる。
C++を知っているとJavaとかも簡単に理解できる。
C#
printfとputsはどっち使えばいいですか? 皆さんどっち使ってます?
>>732 使っているのは断然 printf だよ
printf を使うことで処理速度に問題が出るようなコードは書いてないから
賢いコンパイラは適当に最適化してくれるから、printfつかっとけ。
<double> 43 23 <apple> 100E+02 102E-8 102E-12 <leon> 23E+01 12E-02 <kon> 24 23.3 とかいうファイルからE表記の数値だけを抜き取るにはどうすればいいですかね?
737 :
736 :2007/09/11(火) 22:45:47
<double> 43 23 <apple> 100E+02 102E-8 102E-12 <leon> 23E+01 12E-02 <kon> 24 23.3 とかかれたファイルからですね。ファイル名はlist.txtとしておきます。
>>737 // 使用法 a.exe < list.txt
#include<stdio.h>
#include<string.h>
int main(void)
{
char buf[100];
double value;
int pos;
while(scanf("%s", buf)==1)
{
if(strchr(buf, 'E')!=NULL)
if(sscanf(buf, "%le%n", &value, &pos)>=1)
if(buf[pos]=='\0')
printf("%e\n", value);;
}
return 0;
}
739 :
736 :2007/09/11(火) 23:13:38
やってみます
740 :
736 :2007/09/11(火) 23:14:44
ありがとうございます
(゚Д゚≡゚Д゚)エッナニナニ?
入力した文字を逆にして出力したいのですが #include <stdio.h> #include <string.h> int rev (char *); int main() { char str[100]; printf("文字を入力してください\n"); gets_s(str); rev(str); printf("逆にしたのはこれです\n"); printf(str); return 0; } int rev (char *str) { int i=0; char str2[100]; size_t len; len=strlen(str); while(len>=0){ str2[i]=str[len]; i++; len--; } str=str2; return 0; }
なぜかlenのカウントも増えていくんですけど何処がおかしいですか?
>char str2[100]; >str=str2; とりあえずこれはまずい 「C言語 スコープ」とかでぐぐれ
関数からの見える範囲でしたっけ ちょっと調べてみます
746 :
問題 :2007/09/12(水) 03:04:16
問題:ポインタで操作しなさい char moji[] ="ABCDEF〜XYZ"; /*最大文字26文字*/ char *pc; pc=moji; 結果 moji:ABCDEF〜XYZ 開始位置==>B 終了位置==>F 表示:BCDEF moji:ABCEF〜XYZ 開始位置==>D 終了位置==>D 表示:D moji:ABCDEF〜XYZ 開始位置==>E 終了位置==>B 表示:EF〜XYZAB
747 :
746の続き :2007/09/12(水) 03:05:46
#include <stdio.h> #include <stdlib.h> #include <string.h> void print(char* s, char* e) { printf("表示:"); for( ; s <= e ; s++ ) putchar(*s); puts(""); } int main(void) { char moji[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char *pc = moji, *pcstart, *pcend, start, end; while(1) { printf("moji:%s\n開始位置==>", moji); scanf("%c", &start); printf("終了位置==>"); scanf("%c", &end); pcstart = strchr(moji, start); pcend = strchr(moji, end); if( pcstart == NULL || pcend == NULL ) break; if( pcstart <= pcend ) print(pcstart, pcend); else print(pcend, pcstart); } } この問題でどうしてもエラーが出るんですが何方かわかる方がいましたら教えてください
748 :
デフォルトの名無しさん :2007/09/12(水) 03:14:23
>>742 void rev(char *str)
{
int len = strlen(str);
int i;
char temp;
for(i = 0; i<len/2; i++)
{
temp = ary[i];
ary[i] = ary[len -i-1];
ary[len -i-1] = temp;
}
}
749 :
742 :2007/09/12(水) 03:16:21
>>746 ちょ・・・ヒントかなぁって思って頑張って書いてたよorz
>>747 エラーってどんなエラー?
scanf("%c"〜の挙動を理解してないとかそんなオチ?
751 :
742 :2007/09/12(水) 03:26:59
>>748 sry[i]って初めて見るんですけどこれはなんでしょう?
参考に組ませて頂きます
752 :
742 :2007/09/12(水) 03:27:42
×ary[i] ○ary[i] でしたね
753 :
746の者です :2007/09/12(水) 03:29:31
警告 W8012 07.cpp 7: 符号付き値と符号なし値の比較(関数 MojiSearch(char *,char *) ) 警告 W8012 07.cpp 8: 符号付き値と符号なし値の比較(関数 MojiSearch(char *,char *) ) 警告 W8004 07.cpp 5: 'j' に代入した値は使われていない(関数 MojiSearch(char *,char *) ) ↑がエラー内容です 6ヶ月ぶりにCに触れたんですが仕組みを忘れちゃってどう直せばいいのかわからなくなってしまったんですよ^^;
まずそのソースうpしる
>>747 にMojiSearchなんて関数ないだろ
755 :
デフォルトの名無しさん :2007/09/12(水) 03:32:34
>>747 scanf実行後stdinには'\n'が残っていて
後のscanfが'\n'をとりこんでしまってる。
一応getc(stdin)で取り繕って変更したソース
の一部を載っける
int temp;
while(1) {
printf("moji:%s\n開始位置==>", moji);
scanf("%c", &start);
temp =getc(stdin);
printf("終了位置==>");
scanf("%c", &end);
temp =getc(stdin);
>>753 それはエラーじゃなくて警告って言うんだよ
>>753 signedとunsigned比較してんだろ
3つ目の警告は見たまんま
758 :
742 :2007/09/12(水) 05:06:22
>>748 #include <stdio.h>
#include <string.h>
void rev (char *);
int main()
{
char str[100];
printf("文字を入力してください\n");
gets_s(str);
rev(str);
printf("逆にしたのはこれです\n");
printf(str);
return 0;
}
void rev (char *str)
{
int i=0,len=strlen(str);
char str2;
printf("文字の長さは%dです\n",len);
for(i=0;i<len/2;i++){
str2=str[i];
str[i]=str[len-i-1];
str[len-i-1]=str2;
}
}
ary[i]がまだ謎だけど出来たよ、ありがとう
759 :
746 :2007/09/12(水) 10:35:45
自分で書いた方のソースがvoid rev (char *ary)だったんで レス欄にコピペしたとき、「ああ、strか」と思い aryの部分をstrに全部書き換えたつもりだったが 中途半端に書き換えちった というわけ
警告を無視する奴は、とりあえず渓谷に行って来い
761 :
742 :2007/09/12(水) 15:41:36
>>759 なるほど
あえて自分で考える事が出来たし結果オーライだったw
lenの-1も気づかなかったしなorz
スコープについてはまだ良くわかってないけど・・・
スマソ スコープについて調べろってのは勘違い str2へのポインタを関数の外で使おうとしてるのかと思った
763 :
デフォルトの名無しさん :2007/09/12(水) 22:55:14
2点質問があります。 1.関数で配列全体を呼び出しもとに帰すにはどう記述すればよいのでしょうか? 例)a[0],a[1],a[2],a[3]といった、算出した値を配列要素としてではなく、配列全体をreturn文で返す 方法がわからずにおります。 2. 1+X+X^15で生成する疑似ランダムデータの作製法がわからずにおります。 どうかご教示願います。
やさしいCを打ち込み終了し他の本も色々調べたのですが、 ポインタとかを理解するにはPICを勉強したほうが分かりやすいですか?
766 :
デフォルトの名無しさん :2007/09/12(水) 23:05:53
>>764 急いでいるのでマルチポストをしてしまいました。申し訳ございません。
>>764 大体、関連した話題を扱うスレッドには同じ人が見にきているものだ。
だからマルチポストするとすぐに見つかってしまう。しかも反感を買い回答が得られなくなる。
だから1箇所に投稿し、回答が得られるまで自分でも必死こいて調べるべし。
>>767 ,769
ありがとうございます。問題を解くことからはじめます。
>>771 宿題スレの問題をやってみるとか。
いろんな人が同じ問題を問いて解答も出してくれるので、
自分とここが違う、とか、これはこうやって実現するのか、とか、
いろいろ気づくところがあるかも知れないよ。
標準ライブラリ関数を使わずに、コンソールに文字列を出力してみようと思い システムコールのwriteを使ってみたつもりです。 #include <unistd.h> int main(void) { char s[] = "test\n"; write(1, s, sizeof(s)); return 0; } Cygwin の gcc 3.3.3 で、-ansi -Wall -pedantic -fno-builtin で コンパイルできて、期待した動作になりました。 で、glibc-2.6.1の io/write.c を見ると /* 続く
続き、少しインデントを変えています。 */ #include <sysdep.h> #include <errno.h> #include <unistd.h> #include <stddef.h> ssize_t __libc_write (int fd, const void *buf, size_t nbytes) { if (nbytes == 0) return 0; if (fd < 0) {__set_errno (EBADF); return -1;} if (buf == NULL) {__set_errno (EINVAL); return -1;} __set_errno (ENOSYS); return -1; } libc_hidden_def (__libc_write) stub_warning (write) weak_alias (__libc_write, __write) libc_hidden_weak (__write) weak_alias (__libc_write, write) #include <stub-tag.h> write.c にはこれだけしかないのですが、 fd の値や *buf 内のデータなどは、どこで使われているんでしょうか? たとえば buf は NULL とだけ比較していますが、 実際に fd に向かって buf を書き込む(?)処理は、どこでやっているんですか?
776 :
問題 :2007/09/13(木) 11:59:26
何方か今から掲示する4問の問題が合ってるか教えてください(パソをメンテに出していて手元になくて調べられないんです^^;) キーボードより表示開始文字と表示終了文字を入力し、開始〜終了までの文字を表示しなさい char moji[]="ABCDEF〜XYZ"; /*大文字26文字*/ 実行画面 moji:ABCDEF〜XYZ 開始位置==>B 終了位置==>F 表示:BCDEF moji:ABCDEF〜XYZ 開始位置==>D 終了位置==>D 表示:D moji:ABCDEF〜XYZ 開始位置==>E 終了位置==>B 表示:EF〜XYZAB
777 :
776の答え :2007/09/13(木) 12:00:14
moji:ABCDEF〜XYZ 開始位置==>B 終了位置==>F 表示:BCDEF
778 :
776の答え(777ミスです) :2007/09/13(木) 12:01:06
#include <stdio.h> #include <ctype.h> int main(void) { char moji[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; /*大文字26文字*/ char start, end, *p; printf("moji:%s\n", moji); printf("開始位置==>"); scanf("%c", &start); fflush(stdin); printf("終了位置==>"); scanf("%c", &end); fflush(stdin); if(!isalpha((int)start) || !isalpha(end)) return 1; start = (char)toupper(start); end = (char)toupper(end); p = moji + start - 'A'; for(;;) { putchar(*p); if(*p == end) break; if(*(++p) == '\0') p = moji; } return 0; }
779 :
問題2 :2007/09/13(木) 12:04:11
文字列と削除文字列を入力し文字列中から削除文字を排除しなさい 実行画面 文字列入力(m1)==>ABCDEFAABCDABC 削除文字==>A 結果文字列(m2):BCDEFBCDBC
780 :
問題2の答え :2007/09/13(木) 12:05:38
#include <stdio.h> #include <string.h> #define MAX 256 int main(void) { char str[MAX],ch; size_t sz_str,i; printf("文字配列入力(m1)==>"); fgets(str,sizeof(str)/sizeof(str[0]),stdin); sz_str=strlen(str); printf("排除文字==>"); ch=getchar(); for(i=0; i<sz_str; i++) { if(str[i]!=ch) putchar(str[i]); } return 0; }
この形式の問題何回目だよwwwww
782 :
デフォルトの名無しさん :2007/09/13(木) 12:34:12
くだらん質問なんだけど バッファサイズを256とか512みたいな16の倍数にしてるコードよく見るけど そうするとどういう効果があるの?
単にキリがいいから使ってるだけ
どっちかっつうと2の乗数だが、キリが良いから
786 :
デフォルトの名無しさん :2007/09/13(木) 13:23:03
キリがいいからか 漏れもなんとなくキリがいいから使ってたよw サソクス
文系グラマは100とか1000使うのかな
788 :
デフォルトの名無しさん :2007/09/13(木) 13:46:38
main関数の戻り値ってどういう時使うんですか?
>>788 コマンドインタプリタで該当プログラムの終了ステータスとして利用する。
>>788 #!/bin/sh
if ./a.out; then
echo "成功" # main が 0 を返した時
else
echo "失敗..." # main が 1 を返した時
fi
printf("%6.1f",123.45); を実行すると 123.5 となるのはなぜですか? 123.4になぜなりませんか?
一つしたの桁を四捨五入するから。
>>775 ありがとうございます。newlibですか。
ではCygwinはおいといて、
>>774 はglibcの実装についての質問とさせてください。
glibcのwrite.cで定義されている __libc_write の仮引数の使われ方について
なぜこの引数でfdへ書き込みがおこなわれるのでしょうか?
たぶんそのソースは実際にコンパイルされるコードじゃない。 システムコールをどうやって呼ぶかはOSやCPUによって異なるから、それはただのプレースホルダだろう。 ざっとみてみたところ、sysdeps/unix/syscalls.listからmake-syscalls.shで自動生成されるんじゃないかと思った。 でも複雑すぎて追いきれん。 実際に特定のターゲット向けにビルドしてみて、生成されたファイルを見なきゃ判らなさそう。
>>795 その関数はターゲット用のwrite()が存在しない場合に使われるダミー関数。
writeしても呼ばれない。
0: -19.312 -0.144 -0.996 1.412 -0.173 1.933 3.954 4.917 6.333 1.552 -1.515 -1.667 -0.151 0.230 -0.024 0.083 0.377 0.665 0.722 -0.195 -2.321 -1.814 -0.133 0.515 1.343 0.000 1: -19.304 -0.162 -1.799 4.184 1.255 -0.393 -0.335 0.469 1.268 -2.177 -2.390 0.198 -0.151 -0.086 0.111 0.100 0.038 1.462 0.937 -0.569 -0.975 -1.590 -0.486 -0.450 0.133 0.000 2: -18.166 -0.254 -0.178 1.909 2.438 6.705 5.126 -4.463 -0.205 2.752 1.499 4.116 -0.151 0.167 -0.024 -0.312 -0.069 1.179 0.724 -0.214 0.460 -0.921 0.742 0.284 -0.377 0.000 こうかかれたファイルから小数点のところだけ とりだして二次元配列にいれるにはどうすればいいすかね? 小数点のところ26個あるんですけど。
コロンの後まで飛ばして読み込め
指定したパスに、ある拡張子のファイルが存在するか調べるために _dos_findfirstを使用して、BCCでコンパイルしたら > Warning W8053 2007-09-14_1.c 11: '_dos_findfirst(const signed char *,unsigned int,find_t *)' > is obsolete in function main という警告が出ました。obsoleteとは「旧式の、廃れた」という意味です。 これに代わるものはありますか?
>>800 dos.hの_dos_findfirst()か、_dos_xxxは古いわなあ。
io.hの_findfirst()でどうか。
ものすごく初歩的な質問で申し訳ありません。 C言語の入門書にそって勉強していたのですがすぐに躓いてしまいました。 hello worldを表示するソースファイルをコンパイルしようとしたのですが下のエラーが出てきてしまいました。 C:\cwork>bcc32 sample.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland sample.c: エラー E2209 sample.c 2: インクルードファイル 'stdio.h' をオープンできない 警告 W8065 sample.c 6: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main ) *** 1 errors in Compile *** 何かと思い検索してみて確認したのですが原因がわかりません。 なにか分かる方いらっしゃればアドバイスよろしくお願いします。
>>803 C:\borland\bcc55\Include\ の中にファイルはあるか?
インストールはどのファイルをどうやって実行した?
>>803 PATHを通してないんでしょうな、多分。
PATH通してなかったらbcc32自体出来ないだろ
オレもそう思った。 cfgもデフォルトだろうし、アップデート用のインストーラ使ったんじゃないかと予想。
皆様すばやいレスありがとうございます。
>>804 様
C:\borland\bcc55\Includeの中にstdio.hはありました。
インストールはその入門書についてあるCDに収録されていた
freecommandlinetools2.exeというファイルを実行しました。
>>807 様
Pathは通したつもりでいます。
入門書に書かれてあることをそのまま行っただけなので間違いないとは言い切れませんが。
C:\borland\bcc55\Bin に、 bcc32.cfg、ilink32.cfg はあるか? テキストエディタで開いて、以下に設定されているか確認。無ければ以下のをそれぞれ保存 ・bcc32.cfg -I"c:\Borland\Bcc55\include" -L"c:\Borland\Bcc55\lib;c:\Borland\Bcc55\lib\PSDK" ・ilink32.cfg -L"c:\Borland\Bcc55\lib;c:\Borland\Bcc55\lib\PSDK"
結局、インクルードパスか、、、cfgが確実だな
812 :
803 :2007/09/14(金) 15:36:19
>>810 様
bcc32.cfg、ilink32.cfg はC:\borland\bcc55\Binにあります。
bcc32.cfg、ilink32.cfg ともに;c:\Borland\Bcc55\lib\PSDK"の部分はありませんでした。
そこで;c:\Borland\Bcc55\lib\PSDK" を追加してみましたがやはりエラーでした。
>>807 >>808 知ったかぶるなら黙ってろ。お前らの頭じゃPATHの意味すらわかってなさそうだから。
>>807 カレントディレクトリをコンパイラのある場所に移動すりゃ良いんじゃね?
エラーメッセージから推測できるのは、必要なファイルのある場所の
設定がされていないということ。つまり、そういうことだ。
PATHが必要なものに設定されていればどうなるか、分かるよね?
>>813 おまえ、名指しで何か言うなら知ったかしないほうがいいぞ
PATHの意味を言ってみ?
>>816 >C:\cwork>bcc32 sample.c
>Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
この2つからPATHが通っているのは明白
>>817 味方にボールを送る事に決まってんだろうが
それはPASS
>>819 アホか
ヤマハの電動アシスト自転車の事だろ
822 :
803 :2007/09/14(金) 15:57:16
>>814-815 様
ありがとうございます。
試してみようと思います。
>>816 様
ソースファイルを作成したc:\cworkというディレクトリに移動しているのですが、こういうことでしょうか?
823 :
803 :2007/09/14(金) 16:10:52
>>814 様のソフトをダウンロードして自動設定したら解決できました。
皆様お忙しいところくだらない質問に時間を割いていただき本当にありがとうございました。
結局、原因はなんだったんだろうな
どういたしまして がんばって
cfgのタイプミスだろうなあ・・・
知らないならレスしなくていいよ つーか知っててもスルーしてるが
829 :
デフォルトの名無しさん :2007/09/14(金) 18:49:34
FFFFFF80を2進数に直すと、どうして 11111111 11111111 11111111 1000000になるのかわかりません 特に、80は 0101000では?
831 :
デフォルトの名無しさん :2007/09/14(金) 18:56:10
レス、ありがとうございます ??? 間違っているのですか?
832 :
デフォルトの名無しさん :2007/09/14(金) 18:56:41
16進の80 2進だと1000000 10進の80と誤解してると思われ
833 :
デフォルトの名無しさん :2007/09/14(金) 18:59:02
0一個たんなかった
834 :
デフォルトの名無しさん :2007/09/14(金) 19:02:19
>>832 ん〜どうしてもわかりません
では、2進数の80では、0101000で合っていて
16進数の80では、どうして1000000になるのでしょうか?
2進数の80なんかあるか。2進数は1と0だけ。
(x)y を y進法で表すxとする (80)10 = (0101000)2 (80)16 = (128)10 = (10000000)2
16進数の80 = 10進数の128 = 2進数の10000000 16進数の50 = 10進数の80 = 2進数の10100000
839 :
837 :2007/09/14(金) 19:18:05
うぁ。みすorz
840 :
829 :2007/09/14(金) 19:23:39
皆さん、レスありがとうございます。
>>16 進数の80 = 10進数の128 = 2進数の10000000
16進数の50 = 10進数の80 = 2進数の10100000
では、一旦10進数に置き換えてから、2進ぬするのでしょうか?
どうやれば、16進数の80は10進数の128に、又は16進数の50は10進数の80に
直せるのでしょうか?
>>840 ググれば解説しているサイトはたくさんある
>>840 16進から2進の場合、は分割するんよ
FFFFFF80
F=1111 , 8 = 1000 , 0=0
あとはくっつける
1111 1111 1111 1111 1111 1111 1000 0000
FFFFFF80(16)=11111111111111111111111110000000(2)
って感じ
>>840 失礼、ちょっと訂正
FFFFFF80
F(16)=1111(2) , 8(16)=1000(2) , 0(16)=0000(2) ね
10進に直すより16進→2進 、2進→16進の方が楽(のはず)
844 :
デフォルトの名無しさん :2007/09/14(金) 19:42:23
さすがにゆとり教育杉な気もしてきた
C言語がいいらしいんですが無料でできますか?
846 :
デフォルトの名無しさん :2007/09/14(金) 19:46:33
はい
847 :
デフォルトの名無しさん :2007/09/14(金) 20:11:41
ありがとうございましm(__)m これで先に進めます
>>840 の解説に同意。
16って2^4(二の四乗)の事ですよね。
つまり、2進数表現4ビットの最大値(1111)
が、16進数Fに相当している事もわかりますよね。
したがって、
>>840 の解説を御借りすると、
FFFFFF80
F=1111 , 8 = 1000 , 0=0
【|】(パイプ)で区切ると
1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1000 | 0000 (2)
F F F F F F 8 0 (10)
となります。
C言語なんですが、ファイルに書き込むときって自分でEOF書き込むんですか?? それとも、閉じるときに勝手にやってくれるんでしょうか。
>>850 閉じるときに勝手にやってくれる。
つか、EOFというデータはないんだけど。
ファイルの最後まで読んだときfreadなどのファイル入出力関数がEOFを返すだけ。
あ、そうなんですか! てっきり、改行コードみたいにEOFっていう記号があるのかと思いました。。。
URL
>>852 EOF=1A じゃなかったかな。昔のテキストファイルには使っていたと聞くよ。
856 :
852 :2007/09/15(土) 00:40:18
>>855 MS-DOSのテキストファイルにはEOF(1Ah)が書かれていたようですね。
EOF(1Ah)がファイル内に実際にデータとして書かれているものと書かれていないもの
さらに、書かれているもののうちアプリケーションがこのEOF(1Ah)をデータとして
意識すべきものと意識しなくてよいもの
があるようですね。
ファイルのデータをレングスで管理しているファイルシステムはEOFがなくて、
このレングスがないファイルシステムにはEOFがデータとしてある。
ということでしょうか。
857 :
852 :2007/09/15(土) 00:45:30
ということで
>>850 さん
EOFをアプリケーションで書き出す必要があるかないかは、
「ファイルの仕様による」ということです。
Windowsのハードディスクのファイルは書き出す必要はありません。
>>852 、855
ありがとうございます〜 むっちゃわかりやすかったっす。
CのライブラリのEOFとアプリが使う終了のマークを一緒にしたらだめでしょ。
>>857 >Windowsのハードディスクのファイルは書き出す必要はありません。
判っていないのならレスしなくてもよろしいのでは?
どうやらPATHの意味をそれぞれ勝手に解釈している同士が罵り合っている模様。 仲のいいことで。
>>861 そういうレスはいけないと思うよ。
間違っているを指摘すべきだと思う。
猫でもわかるC言語プログラミングP.196によると下記のようなプログラムはだめ ということですがBCCではコンパイルが通り、実行しても問題は見られませんでした char *strではなくchar str[32]なら可とのこと なぜでしょうか? もうひとつ 下記のプログラムでprintf("%sの長さは%dです\n",*str,len); のように%sに対して*strとすると実行時にエラーになりますが *strなら中身のASCIIコードが入っているはずで問題ないと思うのですが… ご教示願います。 #include <stdio.h> #include <string.h> int main() { char *str; size_t len; printf("文字列を入力してください。--"); scanf("%s", str); len = strlen(str); printf("%sの長さは%dです\n",str,len); return 0; }
char str[32]でも不可です
>>864 > 猫でもわかるC言語プログラミングP.196によると下記のようなプログラムはだめ
> ということですがBCCではコンパイルが通り、実行しても問題は見られませんでした
> char *strではなくchar str[32]なら可とのこと
問題が無かったのは str の指す先が*偶然*致命的な場所で無かっただけで
予期しない場所が書き換えられています
str が指す先がちゃんと確保されている場合には問題は無いです
>>864 その本には、なぜダメかってのは書いてないのか。
869 :
デフォルトの名無しさん :2007/09/15(土) 04:39:20
scanfとprintfの関数の違いと働きを教えてください。お願いします。
>>869 scanf - scan with format
printf - print with format
さすが猫ですね
データが1個増えるたびにreallocしてることが発覚しましたw バカすぎますか?
はい
データが増える間隔とデータ量による
>>873 実装が楽なので使い捨てコードのときにはそうします
>>873 一個ごとでも、まったくOK。
データの複数個ずつぶんのメモリを確保しても、ほとんどの場合は、
スピードアップしません。
vectorとかでも中では一回ごとにrealloc的なことしてるんだっけ?
>>878 ここは C のスレですぜ
> vector
ってなに?
880 :
デフォルトの名無しさん :2007/09/16(日) 01:34:48
ここは東京だぜ
読み込んだ数式を逆ポーランド記法に変換しようとしてるんですが、 1+(3+(4-2)+1)*4 のようにすると、1342-+1+4*-という式になってしまいます。 else if(source[i] == ')'){ while( now > 0 && stack[now -1] != '('){ rpn[r++] = stack[--now]; } --now; } 原因がわかりません。教えてください。 できれば解決策もm(_ _)m
882 :
864 :2007/09/16(日) 02:45:34
レスありがとうございます
>>865 確かに%cとすると一文字だけですが表示されます
JavaをかじってたこともあってString型がCにもあると思い込み,いわゆる文字列がポインタであることを理解していませんでした
pritf("%d",i);のようにカンマの後には変数名を書けばよいと思っていましたが
%sの場合は例外でポインタを書かないといけないのですね
確かにそうすると表記上はすべて変数名のように見えて綺麗ですから、そのためにそのような設計になったのでしょうか…
>>866 31文字以上は入力しないという前提でも不可なのでしょうか?
>>867 char *str ではポインタ(アドレス変数)が確保されただけでその中身については未定義で
さらに、その中身のアドレスの後ろが他のことに使われていないという保証もないから不可で
char str[32]なら31文字分については安全な場所が確保されるからOKという理解で正しいでしょうか
>>869 本文をそのまま引用すると
『strはchar型へのポインタですね。ということはアドレスを格納する変数なのです。これではだめですね。』
とのことです。
しかし、scanfやstrlenについては、渡すべきものはアドレスであり間違えているようには考えられず
printfについても%sにはポインタを渡すのであっているようなので理由が私にはわかりませんでした。
適当な本だな
渡すべきものはアドレスだが、その渡しているアドレスの値が適切なのかどうかということだ。 scanfは、渡されたアドレスが示すメモリ領域を書き換えるのだから、適当なアドレスを渡してはいけない。 特に、初期化してないポインタ (どのアドレスを指してるか不定) を渡すなんて、もってのほか。 書き換えられても安全な領域 (char[32]とか) を用意して、そのアドレスを渡す必要がある。
885 :
881 :2007/09/16(日) 04:01:59
すみません自己解決しましたm(_ _)m
1+(3+(4-2)+1)*4 は逆ポーランド記法で 4 2 - 3 + 1 + 4 * 1 + で合ってますか?
887 :
デフォルトの名無しさん :2007/09/16(日) 04:22:14
車輪の再開発は止めましょう その程度の計算なら電卓でできます。 暗算でもできるでしょ? 作る意味無いよ
∩_ 〈〈〈 ヽ 〈⊃ } ∩___∩ | | | ノ ヽ ! ! / ● ● | / | ( _●_) ミ/ <こいつ最高にアホ 彡、 |∪| / / __ ヽノ / (___) /
∩___∩ | ノ ヽ ! / ● ● | こいつも最高にアホ | ( _●_) ミ 彡、 |∪| / .\ / __ ヽノ / \ ...\ (___) / .│ ..│ / ヽ l..lUUU .U
そんな餌に俺様が釣られクマーー
>>886 1+(2+3) と 2+3+1 が同じだというならそれでも合ってる
>>873-879 おれの居る現場の既存のコードでは、
最終的に300〜400MBのメモリを確保するのに、reallocを繰り返して、
延べ 2.5GBぶんコピーを繰り返している事が分かったよ。
DBのテーブルのデータを一度メモリーに全部取り出すんだ...orz
>>894 それだとDBの意味ががが
元からなさそうな感じではあるけど
realloc()を使うと、毎回確保し直すと思っている馬鹿が多いのか? 自分でわざわざ回数まとめてからrealloc()するようなコード書くより、 毎回realloc()する方が速いかもしれないぞw
そんな当たり前の事言われても。
898 :
894 :2007/09/16(日) 13:03:07
>>895 まあ100%無意味って訳じゃないんだけどね。一応SQLの恩恵は受けているから。
でもバッチ系が全部、「始めてプログラムを組んだんじゃないか?」ってレベルなんだ。
>>894 のコードも基本的に集計するだけだから、DBの設計さえ良ければ単純なSQLで済むはずなのになー。
ハッ、ここは愚痴スレじゃなかったなスマソ。
気づいたんなら送信するな
900 :
894 :2007/09/16(日) 13:16:21
>>896 その話は聞いたことあるが、そういうレベルじゃない。
reallocその物を使わないで済ませられるような場面でやってるだよ。
realloc()って新たに確保した場所にそれ以前のものをコピーするんじゃなかったっけ? 毎回やっているかは知らんが
>>901 元の領域に連続した領域を確保できれば、単純な拡張でよいので、
コピーは省略出来る。
>>901 #include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
void *ptr=NULL, *new_ptr;
int i, count=0;
for(i=1;i<=1000;i++){
new_ptr=realloc(ptr, i*100);
if(ptr!=new_ptr){
fprintf(stderr, "pointer changed. [%d]\n", i);
ptr=new_ptr;
count++;
}
}
printf("change count : %d\n", count);
free(ptr);
return 0;
}
巨大な配列を宣言時に同じ値で初期化したいんですけどこういう場合に簡略化する書き方とかないですかね void func() { static int array[3000] = { 0, .. ,0}; } 的な…
{0} っていうかstaticって自動的に0で初期化されなかったっけ?
サンクス。うまくいきますた。
グローバル変数、静的変数は宣言時に全ての要素が 0 で初期化される。 ローカルな配列は、宣言時に1つ(1要素)でも初期化を行うと残りが全て 0 で初期化される。 int a[3000]; // a[0]〜a[2999] まで全て 0 int b[3000] = {1, 2, 3}; // b[0]=1, b[1]=2, b[2]=3, b[3]〜b[2999]=0 int c[3000] = {1}; // c[0]=1, c[1]〜c[2999]=0 main(){ int d[3000]; // d[0]〜d[2999] まで全て不定値(適当な値) static int e[3000]; // a と同じ int f[3000] = {1, 2}; // bとかcと同じ } よく、ローカルな配列を 0 で初期化するために array[256] = {0}; とか書くが、 1要素でも初期化すると残りが 0 で初期化されることを利用しているだけ。 array[256] = {1}; と書いて全ての要素が 1 で初期化されると誤解するやつが多い。 任意の値で初期化させたければ、n次元の配列はn重のループを普通に書く。 C++ならalgorithmのfillなんかを使えばいい。
>>904 staticなら自動的に0で初期化される。
関数内staticにするなら、他の値は難しいな。
呼び出しの都度初期化でいいならmemsetとかでも良いだろうけど。
複数ファイルにソースを書くときのお作法を知りたいんだけど、わかりやすいところないかな
新しくコード書くとき 既存のファイルに加えるか 新しくファイル作成するか迷うんだけど どういう基準でやったらいいですか?
設計上モジュールが分かれてたらファイルを分ける。 CUnit使うなら1ファイルに1関数。
913 :
◆7qRx8xrwgo :2007/09/17(月) 11:51:39
質問させていただきます。 円記号を表示します。 :\ アポストロフィを表示します。:\ と、出力したくて #include <stdio.h> int main(void) { printf("円記号を表示します。 :%c\n", '\\'); printf("アポストロフィを表示します。:%c\n", '\''); return 0; } でコンパイルしてみたのですが、 Sample5.c:5:12: warning: unknown escape sequence: '\216' Sample5.c:6:12: warning: unknown escape sequence: '\216' とエラーが出たのですが、どうすればエラーが表示されなくなりますか?
915 :
デフォルトの名無しさん :2007/09/17(月) 11:55:23
「表」の後ろに¥を入れれば直るかも。
OSとコンパイラは何?
>>913 文字コード Shift-Jis の時
[表示] = 0x95 0x5C 0x8E 0xA6
0x5C = '\\'
0x8E = 0216 <- 8進数
\216 を解釈しようとして、そんなエスケープシーケンスがないという
*警告*がでているだけ
日本語対応しているコンパイラを使うほうが楽
918 :
913 ◆7qRx8xrwgo :2007/09/17(月) 12:16:57
>>914 本に表示と書いてありました
>>915 失礼ながら半信半疑で試したところ、仰るとおり直りました。
>>916 OS:Wndows XP HE SP2
コンパイラ: gcc(Cygwin)
>>917 解説ありがとうございます。今はコンパイラを変えたくないのでこのままでいこうと思います。
もしよろしければ、「表示」のように、気をつけた方がいい単語が他にもありましたら教えてください。
>>918 ―ソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃
gcc に --input-charset=cp932 --exec-charset=cp932 オプションをつけてみ
>>920 thx
MinGW (GCC.EXE (GCC) 3.4.2 (mingw-special)) でもいけたよ
さっそく CFLAGS に追加しておいた
922 :
918 ◆7qRx8xrwgo :2007/09/17(月) 12:36:56
>>920 仰るとおりに実行した所エラーが表示されることも無くコンパイルできました。感謝です。
923 :
デフォルトの名無しさん :2007/09/17(月) 12:41:51
皆さん、実際にC言語でどのようなソフトを書かれているんですか?
OS書いていますけど?
通信プロトコル。 OSIでデータリンクからセッションぐらいまで
926 :
デフォルトの名無しさん :2007/09/17(月) 12:55:28
どこにもしようしているおえすめいかいてない あおえすをしいでかいてるのか すごいなおまえ
C言語は学校の授業や課題でしか使わんな 普段使うのはVC++かJavaかC#
>>923 去年、一年くらい、10年くらい前に作られたシステムの保守要員やらされて、辟易した。
929 :
デフォルトの名無しさん :2007/09/17(月) 16:20:36
保守ってどんなことやるの?
>>929 お客さんとこのシステムの構成が変わったりなんか要望があったら、それにあわせてコードを書き換えたりとか。
新規のお客さんもあったけど、すでにあるコードから必要なコードをコピペして、ちょっといじって
もって行ったりとかするだけ。
ものすごくつまんなそうな仕事ですね
つまらないうえに、すごいつらかった。 基本的にソースコードぐちゃぐちゃだし。
今の現場、つまらないうえに、すごいつらい。 基本的にソースぐちゃぐちゃだし。
既存のファイルのファイルスコープにある変数や関数を使いたい、 っていうんじゃないんだろうから、迷ったら別ファイルでいいんじゃないでしょうか? ファイルを分ける弊害って、なにかあるでしょうか?
935 :
934 :2007/09/17(月) 18:35:31
リロードわすれてたっはっは〜
>>933 でも、大事な仕事だよ。
今後はC言語でも保守の仕事が増えるんじゃないか!?
COBOLはすでにそうなっている。
しっかりとしたコーディング規約があって、その通りに作られていればいいんだが、
Cでの開発プロジェクトにはコーディング規約がないくて、各自各様のスタイルでコーディング
していることが多い。最近はそうでもないかもしれないけどね。
937 :
933 :2007/09/17(月) 22:09:47
>>934 は
>>911 に対するレス?
>>936 スタイル云々以前の問題でね、多分プログラミング自体の経験が無い人か、
少なくとも、スコープを分かってない人が書いたプログラムで、それが原因のバグとかもある。
おそらくテストもマトモにしてないと思われるよ。orz
>>911 で、「分ける分けない」て話は、スコープとも関わる話なのでスコープを理解すること。
関連性が強い物、似たような機能のものを集めるという分け方もある。
「モジュール強度 結合度 独立性」という言葉を調べると何かわかるかも。
>>937 「モジュール強度 結合度 独立性」
なつかしい言葉だね
939 :
デフォルトの名無しさん :2007/09/18(火) 01:53:17
何方か、標準関数とポインタ変数についてを詳しく教えてくださる方はいらっしゃいますか? 自分が持ったいた参考書がこの2つの内容が掲載されてた部分が破けていて分からなくて困っています^^;
941 :
デフォルトの名無しさん :2007/09/18(火) 02:05:59
940>有難う御座います
>>940 >「&」をアドレス演算子といいます。「&」がアドレスを表すので「"アンド"レス」と覚えておくと分かりやすいかも知れません。
なごんだ(´ー`)
今更Cなんて初めて使う機会ないよ OSやドライバを作るなら必要だが、そのレベルに達するまで恐らく5年以上は掛かるだろう
がんばれば30日でできるらしいぞ
あれかw
C言語の言うことなら何でも聞きます
948 :
デフォルトの名無しさん :2007/09/18(火) 03:01:06
全角は2文字
ちょっと語弊を招きかねない回答だなw 全角文字は2バイトなのでC標準のstrlenのようにバイト数を返す関数を使用した場合、文字数が得られるとは限らない。 ちゃんとロケールを設定すれば6になるはずだが?一字一句間違えずにコピペした?
>>949 ダウンロードして展開した wcslen.c というファイルを euc-jp-unix にしてから
そのままコンパイルして実行してます。
>>947-950 試してみたが、VC++では 6 が返ってきた。
cygwin gcc 3.4.4 ではコンパイルできなかった。
L"Cプログラム"; の L でパースエラー。
え?ってかCなの?C++じゃなくて? C標準に2バイト文字なんて概念あったっけ?
wchat_t
954 :
デフォルトの名無しさん :2007/09/18(火) 07:52:09
質問させてくださりませ。 void parse_long_options (int _argc, char **_argv, const char *_command_name, ...); の中の"..."の点三つはどういう意味なのでしょうか? ご教授宜しくお願い致します。
引数の数が可変であるってこと。
>>951 --input-charsetと--exec-charsetを指定すればCygwinのgccでもコンパイルできる。
ポインタ変数をつかってscanfで値を二つ入力して、値の大きい方の数字を表示するプログラムってどのようにして作れるんでしょうか
>>958 キミがわからないのは
ポインタ変数、scanf関数、数値の大小の比較、数字を表示
のどれ?
ポインタ変数をつかった比較です
それは比較が分かっていないんじゃなくてポインタ変数が分かっていないんだ。 *i1 > *i2
>>960 ポインタ変数を使った比較が判らないのなら、ポインタ変数を使わずに比較すればいいじゃない。
つーか、>958にはポインタ変数を使って比較をせよとは書かれていないのだが。
963 :
デフォルトの名無しさん :2007/09/18(火) 16:32:58
>>956 どうも、ありがとうございます!
もう一つご教示いただければ幸いです。
#ifndef _CYGWIN_CONFIG_H
#ifdef __cplusplus
extern "C" {
#endif
#define _CYGWIN_CONFIG_H
の中のextern "C" {
というのはなんなのでしょうか。
どういった意味なのかわけがわかりません。
>>963 C言語には関係ないので無視していい。
C言語では、__cplusplus はdefineされていないので、コンパイル対象とならない。
>>963 C++にはオーバーロードがあるから同じ関数名でも区別できる仕組みが必要なんだが、
そのために、Cと互換がなくなる。C++で作った関数をCから呼ぶためにCルールで作る。
マンコグリグリングってやつだ
968 :
963 :2007/09/19(水) 08:16:10
なんとなく分かりました。蟻が十匹居ます。 いや、ありがとうございます!!!
名前マングルでググれ それにしてもなんかエロイ響きだな///
970 :
デフォルトの名無しさん :2007/09/19(水) 17:08:42
質問です。 char moji[2][11]={"あいうえお","かきくけこ"}; とあった場合に、別の変数に代入して表示させることは可能でしょうか? printf("%s",別の変数); のような形です。
1. char betu[11]; strcpy(betu, moji[0]); printf("%s", betu); strcpy(betu, moji[1]); printf("%s", betu); 2. char *betu; betu = moji[0]; printf("%s", betu); betu = moji[1]; printf("%s", betu);
char betu[11]; betu = moji[0]; でおkww
974 :
970 :2007/09/19(水) 20:25:00
ありがとうございます<(_ _)>
971の2だと、よく理解してないやつが勘違いしそう
でも実用的なのは2になる場合が多いよな。
まぁ、いちいちstrcpyなんてしてたらな。
でも、入門篇ということなら
>>1 から覚えていったほうがいい気がする
こっちではないほうのスレで一度質問したのですが 私の説明不足&あっちはまだ次スレが立ってない の理由でこっちで再び質問させてください。 char c = 'a'; char *pc = &c; int *pi = &c; printf("%d\n", (int)*pc); printf("%d\n", sizeof((int)*pc)); printf("%d\n", *pi); printf("%d\n", sizeof(*pi)); 結果 97 4 -1092947871 4 上のように、pcが指しているデータもpcが指しているデータも 4バイト分のはずなのに、実際には*pcは1バイト分の値しか出力されてません。 これは何故なんでしょうか?
>>978 何故そう思ったのかは分からないが、次のようにしてみては?
printf("%d\n", *(int*)pc);
printf("%d\n", (int)*pc); は、つまり printf("%d\n", (int)'a'); だから
>>979 , 980
やっと理解できました。ありがとうございました
C言語で簡単なノベルゲームを作るのに参考になる書籍ってありますか? そもそもの問題でC言語でノベルゲームできますか? VBとかではなくC言語の勉強も兼ねて挑戦してみたいのですが 何から手をつけてよいのかさっぱりなんでおしえてほしいです
>>982 に朗報
printf,scanf,ifだけでできるよー!!
>>982 作れます
書籍を買うのが一番早いです
C言語の本質的な部分だけをやるなら
コンソールだけでおkです
勉強を兼ねるなら、スクリプトを解析して実行するタイプがよくね? 字句解析は面倒だけどためになる部分もあると思う。
ありがとうございます 作れるということなのでがんばってみようと思います 絵とかを入れるとなるとやはり難易度があがりますかね?
「絵を描く、動かす・音を鳴らす」はCオンリーでいくなら大変かと。
そういえば以前、「かまいたちの夜」もどきの画像作成ツールをどこかで見た気がする 同アングルで撮った写真を2枚入力として、写真の差分の大きい部分に 適当な均一色をアルファブレンドするようなツール
>>986 に朗報
printf("\a")で音鳴るよ!!
ブザーユニットないんです><
まずはサウンドは要らないんじゃないか? ゲームブックでいいとおも
ゲームオーバーで恐怖画像出るようなスクリーンセーバーでもシステムコールすりゃいいんじゃね?
いろいろな意見をありがとうございます 自分としては絵まで表示できればいいかな と思ってます もちろん、ものすごく音を入れたいのはありますが BASICしかやったことがない初心者ですので 基礎を覚えるので今のところ精一杯かなと よさげな参考書を書店で探してみようと思います 田舎なので種類が豊富とはいえませんが
>>994 音を鳴らすだけなら簡単
// winmm.lib をリンクすること
#include<windows.h>
int main(void){
// 再生終了まで待たない(ゲームで使うなら多分こっち)
PlaySound("C:\\windows\\media\\tada.wav", NULL, SND_FILENAME|SND_ASYNC);
// 再生終了まで待つ
PlaySound("C:\\windows\\media\\tada.wav", NULL, SND_FILENAME|SND_SYNC);
return 0;
}
win32api勉強すれ。
C言語の入門書とは別に(もちろん入門書を一通りやってからですが)
>>996 さんが指摘してくださったWin32apiのことが書かれているようなので
Windowsゲームプログラミング (Game developer) (単行本)
という本を買おうかと思っているのですが
評価はいかほどのものなのでしょうか
Amazonでは一応、高い評価になっています
^
^
1000ならジュースでも飲むか
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。