C言語なら俺に聞け(入門篇) Part 3
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/10/13(金) 04:55:50前スレ
C言語なら俺に聞け(入門篇) ぱぁと2〜
http://pc8.2ch.net/test/read.cgi/tech/1153818463/
過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
関連スレ
くだすれC言語(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1153542424/
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/
0153141
2006/10/20(金) 09:02:07staticはローカル変数の中でも配列の内容を静敵領域に抑えておく使い方が理想的ってことでしょうか?
文字列定数は静敵領域に確保されると他の本で読んだので、そんなに変わらないように思えたんです
一応もうちょっと先まで進んでるんですが、未だに飲み込めない箇所で…
0154デフォルトの名無しさん
2006/10/20(金) 09:53:35の2つの意味を兼ねているけど、これを同じに考えてごっちゃにしてないか?
>>153のそれも理想的な使い方の一つ。
>>141 初期化しなくても済むってのも同じく使い方の一つ(これは
初期値が代入する規約からの副次効果に過ぎないけど、応用例ではある)。
char *ptr="abc"
char arr[]="abc"
記憶領域確保からすればまったく別物だけど、
これも曖昧ならK&R読むのはまだ早いんじゃないか?
構造体のところは辛いぞ。
0155141
2006/10/20(金) 10:15:06あ、すみませんnameがポインタの配列だってことを忘れていました…
>>141だと文字列長がバラバラで配列で定義すると冗長な部分が出来るから
それぞれへのポインタを配列に格納した方がよくて、その領域を留めるためのstatic、ということですか
0156デフォルトの名無しさん
2006/10/20(金) 11:59:20文字列長とか配列定義とかは、staticと関係ないな。
K&RはCの理解が曖昧だと難しいから、
それよりも初心者本を読み返すのがいいだろう。
もしくは、C FAQでstatic, array, pointer の違いを理解してみろ。
考えるのは、それからでも遅くはないだろう。
0157デフォルトの名無しさん
2006/10/20(金) 12:29:38#どうせ
0158デフォルトの名無しさん
2006/10/20(金) 12:33:37>157の最後の行をもう一度。
#どうせ、長くなることもないし。
0159デフォルトの名無しさん
2006/10/20(金) 12:43:44メモリ効率って何のこと?
知ったかぶりじゃないよね。
0161デフォルトの名無しさん
2006/10/20(金) 15:17:000162157-158
2006/10/20(金) 15:38:19単純にポインタの配列だとポインタの分だけ余計にメモリを食うという話。
どっちみち、文字列分のメモリは消費するのだから。
長さが変わる(この場合より長くなる)場合は、隙間ができるから微妙になるけど。
0163デフォルトの名無しさん
2006/10/20(金) 18:06:180164デフォルトの名無しさん
2006/10/21(土) 20:31:48ようするに書き出しとかでできた、ファイル(aaa.c→aaa.c_)
これで "_" と言うのが付いたファイルができました
参考書に依ると開いて確認しましょうとなっているのですが
開けません・・・・
0165デフォルトの名無しさん
2006/10/21(土) 20:57:510166デフォルトの名無しさん
2006/10/21(土) 21:05:27ありがとうございます、
自分で直せばいいのですね!!!
0167デフォルトの名無しさん
2006/10/21(土) 22:45:150168デフォルトの名無しさん
2006/10/21(土) 23:16:07このスレができる前から、「入門以前」の書き込みは
しばしば見られたからなぁww
「C言語なら俺に聞け(エディタすら使えない人篇)」とか作るか?
もはやC言語でもなんでもないが・・・
0169デフォルトの名無しさん
2006/10/22(日) 03:16:360170デフォルトの名無しさん
2006/10/22(日) 09:41:39ム板にどれくらいエスパーがいるのか知らんが
0171デフォルトの名無しさん
2006/10/22(日) 10:34:34最初に打者8人分の名前を入力して置いて、
それから燃えよドラゴンズの歌詞につなげたい。
例:
荒木、井端、立浪・・・・(以下略)と入力すると、
表示される内容:
1番荒木が塁に出て
2番井端がヒットエンドラン
3番立浪タイムリー
・・・・(以下略)
このような場合はstrcatを使うべきか・・・・
それとも普通のニ次元配列で・・
0172デフォルトの名無しさん
2006/10/22(日) 11:03:18正直、そういうのはスクリプト言語でやるのが手っ取り早い。
つーか、そこでstrcat()云々なんて言い出すようじゃ、到底無理。
0173デフォルトの名無しさん
2006/10/22(日) 13:37:12スレタイ読め
>>171
それだけじゃどっちでもいいとしか言いようが無い
0174デフォルトの名無しさん
2006/10/22(日) 13:56:17スレタイくらい承知の上で敢えて、「無理」と言っている。
現にあんただって(質問が悪すぎて)まともに回答できないじゃないか。
0175デフォルトの名無しさん
2006/10/22(日) 13:57:380176デフォルトの名無しさん
2006/10/22(日) 14:00:480178デフォルトの名無しさん
2006/10/22(日) 18:27:14printf( "1番%sが塁に出て", name[0] );
これの繰り返しで良いんじゃないか?
0179デフォルトの名無しさん
2006/10/23(月) 00:11:42これの繰り返しで良いんじゃないか?
0180デフォルトの名無しさん
2006/10/23(月) 00:16:262番以降は塁にでるって文章じゃねえ
0181デフォルトの名無しさん
2006/10/23(月) 00:56:170182デフォルトの名無しさん
2006/10/23(月) 01:25:040183デフォルトの名無しさん
2006/10/23(月) 01:48:120184デフォルトの名無しさん
2006/10/23(月) 04:20:09printf("一番 %sが塁に出て", name[0] );
printf("二番 %sが送りバント", name[1] );
printf("三番 %sタイムリー", name[2] );
printf("四番 %sホームラン", name[3] );
printf("五番 %sがクリーンヒット", name[4] );
printf("六番 %sが流し打ち", name[5] );
printf("七番 %sヒットエンドラン", name[6] );
printf("八番 %sがスクイズバント", name[7] );
0185デフォルトの名無しさん
2006/10/23(月) 07:01:23"二番 %sが送りバント"
"三番 %sタイムリー"
"四番 %sホームラン"
"五番 %sがクリーンヒット"
"六番 %sが流し打ち"
"七番 %sヒットエンドラン"
"八番 %sがスクイズバント",
name[0], name[1], name[2], name[3], name[4], name[5], name[6], name[7]);
0186デフォルトの名無しさん
2006/10/23(月) 07:32:400187デフォルトの名無しさん
2006/10/23(月) 07:34:480188デフォルトの名無しさん
2006/10/23(月) 08:53:29#include <string.h>
int main(void)
{
int i,l;
char dra[8][2][25]={
{"","一番が塁に出て"},
{"","二番がヒットエンドラン"},
{"","三番タイムリー"},
{"","四番ホームラン"},
{"","五番がクリーンヒット"},
{"","六番が流し打ち"},
{"","七番ヒットエンドラン"},
{"","八番がスクイズバント"}
};
for(i=l=0;i<8;i++){
printf("%d番の選手の名前を入力してください",i+1);
fgets(dra[i][0],25,stdin);
l=strlen(dra[i][0]);
if(dra[i][0][l-1]=='\n')dra[i][0][l-1]='\0';
}
for(i=0;i<8;i++)printf("%.4s %s%s\n",dra[i][1],dra[i][0],dra[i][1]+4);
return 0;
}
0189デフォルトの名無しさん
2006/10/23(月) 14:38:090190デフォルトの名無しさん
2006/10/23(月) 20:55:35出力したのに中身は変わっていませんがいいのですかね?
0191デフォルトの名無しさん
2006/10/23(月) 21:54:31日本語でおk
0192190
2006/10/23(月) 22:50:39そうなんでしょうか?
0193デフォルトの名無しさん
2006/10/23(月) 23:04:07大まかにいうとプログラムから出てきたのが出力ファイル。
.xxx(拡張子)が付いてようがいまいが、ファイルには違いない。
0194192
2006/10/23(月) 23:11:32入門書を読んでも出力ファイルは何に使うのか?理解しがたいです
単なるコピー?なんですかね。入門書に依れば移動するファイルとの
事です。
0195デフォルトの名無しさん
2006/10/23(月) 23:37:56マジ?
0196デフォルトの名無しさん
2006/10/23(月) 23:40:49いいえと答える
0197デフォルトの名無しさん
2006/10/23(月) 23:43:070198デフォルトの名無しさん
2006/10/23(月) 23:49:06プログラムを FAX に例えよう。
ファイルというのは紙のことだ。
出力ファイルというのは、FAX から送信されて出てきた紙のことだ。
つまり、貴方の質問はこういうことになる。
「家のFAXから紙が出てきました。これは何に使うんですか?」
こちらとしては、どこから届いたのか、紙に何が書かれているか、すらわからないのに答えられるわけが無い。
0199デフォルトの名無しさん
2006/10/23(月) 23:51:03必須ではないが知識があればすんなりと理解できるところがある。
知識がないと苦労ことがあるらしい。
0200デフォルトの名無しさん
2006/10/23(月) 23:58:03言語仕様がオブジェクト指向プログラミングをするためにできていないというだけで、できないわけではない。
0201デフォルトの名無しさん
2006/10/24(火) 01:04:22プログラム内でchar型の変数にint型の変数を代入させるにはどうしたらいいのでしょうか
(char)hennsuu1.[data ] = (int)value;
strcpyを使ってhennsuu1に値を入れることはできるのですが
int型の変数を入れることが何故かできないのです。。。
どなたか教えてください
0202デフォルトの名無しさん
2006/10/24(火) 01:07:58int b;
a=b;
0203デフォルトの名無しさん
2006/10/24(火) 01:09:100204デフォルトの名無しさん
2006/10/24(火) 03:32:030205デフォルトの名無しさん
2006/10/24(火) 07:00:08`ヽ、"''ー、._ _,、-‐'" ̄/
\ ~''ー--、__ ,,、-―''"~"~ /
ヽ、 , ヾ'ヽ、__ ./'i~ ̄ ./
\ |! 丶、\"ーェ''7 / / _..,,ノ
`ヽ|`ー-、___"''ゝー<''~ ,,、-'"~i-ー''"~
,,.-‐''""""'''ー-.、
,ィ" \
/ `、
,i ,-っ hennsuu i
/⌒ヽ'_ー-/ _).ィ‐‐-,,_ __|
| r,i \\//-l;l : : : `l-r'"メ、
ヾ、 \/ `ー‐'": i!_,l_ノ` まだまだだな
| ,:(,..、 ;:|/.
| ,,,..;:;:;:;,/
\ `::;;. '"`ニ二ソ\_二つ
\ ゙゙:`-、;:;:;;;:;:;:;;/
/ /~\ \
/ / > )
/ ノ / /
/ / . / ./
/ ./ ( ヽ、
( _) \__つ
0206デフォルトの名無しさん
2006/10/24(火) 08:08:400207デフォルトの名無しさん
2006/10/24(火) 08:31:48atoiアトイ?fabsファブス?とかw
0208デフォルトの名無しさん
2006/10/24(火) 09:23:190209デフォルトの名無しさん
2006/10/24(火) 12:34:36この場合、&pt[n](nは任意の整数0<300な)ってどういう意味だっけ?
0210デフォルトの名無しさん
2006/10/24(火) 12:42:490211デフォルトの名無しさん
2006/10/24(火) 13:56:020212デフォルトの名無しさん
2006/10/24(火) 14:56:32単純化したものを作ってみたのですが、それでも失敗してしまいました。
何が間違ってるのかご指導をお願いします。
/*********/
/* main.c */
/*********/
#include "myhead.h"
int main(void){
func();
x = x+1;
printf("%d\n",x);
return 0;
}
/*********/
/* func.c */
/*********/
#include "myhead.h"
void func(void){
x = 1;
}
改行が多いと怒られたので次へつづく
0213212の続き
2006/10/24(火) 14:57:02/***********/
/* myhead.h */
/***********/
#include <stdio.h>
void func(void);
#ifndef MYHEAD_INCLUDED
#define MYHEAD_INCLUDED
#define EXTERN
#else
#define EXTERN extern
#endif
EXTERN int x;
それで、実行結果は
>bcc32 main.c func.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
main.c:
func.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Warning: パブリックシンボル _x がモジュール C:\BORLAND\KADAI\07\DIVTEST\MAIN.OBJ と C:\BOR
LAND\KADAI\07\DIVTEST\FUNC.OBJ の両方に定義されている
となってしまいます。
よろしくお願いします。
0214デフォルトの名無しさん
2006/10/24(火) 15:12:282 5 8
12 8 1
10 3 5
5 2 3
というようなデータファイルをfopenで読み込み、行ごとにテキストファイルに内容を以下のように書き換えて出力
したいと思ってます。
/***新しくdata1.txtを作り保存する***/
x1 = 1
x2 = 2
x3 = 3
/***************/
/***data2.txtも同様***/
x1 = 2
x2 = 5
x3 = 8
/***************/
/***data3.txt***/
x1 = 12
x2 = 8
x3 = 1
/***************/
・
・
・
といったように生成していきたいのですが、
何かよい方法はありますでしょうか?
0215デフォルトの名無しさん
2006/10/24(火) 15:19:03>bcc32 main.c func.c
ってやったときにmain.cでMYHEAD_INCLUDEDが#defineされるから、
次のfunc.cでは#elseが有効になると思ってる?
残念ながらならないよ。
プリプロセッサはそれぞれの.cファイルで独立して起動されるから、
どっちもMYHEAD_INCLUDEDが#defineされてない状態で起動される。
0216212
2006/10/24(火) 17:07:05レスありがとうございます。
…という事は、私が望む動作は
・ヘッダファイルでは extern int x;
・main.cかfunc.cにグローバル変数として int x;
とするしかない(ほかにあったとしても回りくどい方法だけ)
という認識でOKでしょうか?
0217デフォルトの名無しさん
2006/10/24(火) 18:08:45あるいは
/*********/
/* main.c */
/*********/
#define MYHEAD_INCLUDED /* 追加。名前はもっといいの考えて */
#include "myhead.h"
のようにすればよい。名前にINCLUDEDなんてついていたら
わけがわからんので、その辺は適当に。
0218デフォルトの名無しさん
2006/10/24(火) 18:10:41myhead.hの#ifndefを#ifdefにした方がいいね。
これでmain.cでのみ確実にxが定義されて、
他では宣言になる。
0219デフォルトの名無しさん
2006/10/24(火) 18:14:220220デフォルトの名無しさん
2006/10/25(水) 05:36:340221デフォルトの名無しさん
2006/10/25(水) 13:00:19char* p = s;
�@
p + 100;
�A
p += 100;
�B
p += 100;
*p;
どの時点で未定義ですか?
それともすべて未定義?
0222221
2006/10/25(水) 13:00:50無視してください
0223デフォルトの名無しさん
2006/10/25(水) 20:15:090224デフォルトの名無しさん
2006/10/25(水) 20:35:13A^A→0
になるのは何がすごいのでしょうか・・・
何かこれに感激しないといけないらしいのですが^^;
0225デフォルトの名無しさん
2006/10/25(水) 20:45:420226デフォルトの名無しさん
2006/10/25(水) 20:48:100227デフォルトの名無しさん
2006/10/25(水) 22:52:000228デフォルトの名無しさん
2006/10/25(水) 23:16:33助言、お願い致します。
char str[] = "Hello!" と char key[128] = "abc"
一見、同じ意味に見えてしまうのですが、何が違うのでしょうか?
char keyだと一列が一個だけ、このように"abc"
char strだと一列を複数入れられるのでしょうか?char str[] = {"abc","def","ghi"}
なのでしょうか?
0229デフォルトの名無しさん
2006/10/25(水) 23:22:17と書くと
char str[7] = "Hello!"
とコンパイラが判断してくれる
それだけ
0230デフォルトの名無しさん
2006/10/25(水) 23:27:50??? 何か違うのでしょうか?
0231デフォルトの名無しさん
2006/10/25(水) 23:29:300232デフォルトの名無しさん
2006/10/25(水) 23:31:46とう言うと同じなのでしょうか?
混乱してしまいます。
char keyだと一列が一個だけ、このように"abc"
char strだと一列を複数入れられるのでしょうか?char str[] = {"abc","def","ghi"}
の差ではないのでしょうか?
0233デフォルトの名無しさん
2006/10/25(水) 23:39:12↑
コンパイル通らんよ
char* str[] = {"abc","def","ghi"}
と勘違いしてない?
0234デフォルトの名無しさん
2006/10/25(水) 23:41:26前者は H e l l o ! ヌル の7文字分確保される。
後者は128文字分確保した上で、先頭から a b c ヌル の4文字が入れられる。
それだけのこと。
>>232のような差ではない。
0235デフォルトの名無しさん
2006/10/25(水) 23:45:48→ char str[7] = "Hello!"
→ char str[7] = {'H', 'e', 'l', 'l', 'o', '!', '\0'};
char key[128] = "abc"
→ char key[128] = {'a', 'b', 'c', '\0', '\0', ..., '\0'};
0236232
2006/10/25(水) 23:48:03一旦、整理してから出直してきます。
ありがとうございました。
0237232
2006/10/25(水) 23:54:15そのようでした、では char str[] = {"abc","def","ghi"} いう形は
存在しないんですね
>>234
そうですか、わかりました。
>>235
となると、>>234で書かれた事と同じ、[]内の確保数の
問題で意味は同じと考えて宜しいんですね?
0238デフォルトの名無しさん
2006/10/26(木) 00:11:24関連研究9枚でいいですか?
0239デフォルトの名無しさん
2006/10/26(木) 00:18:16BCB5ラーニング使用してるんですが
Windows XP標準の圧縮(ZIP)ありますよね
プログラム側から制御する方法ってありますか?
0240デフォルトの名無しさん
2006/10/26(木) 00:26:08シェルフォルダとして扱えるらしい。
http://forums.belution.com/ja/vc/000/368/03s.shtml
#importがBCBでも使えるかどうかは知らないが。
0241デフォルトの名無しさん
2006/10/26(木) 00:38:32おおおおっ!!
ありがとうございます
がんばってみます
お世話になりました
0242デフォルトの名無しさん
2006/10/26(木) 13:22:20教授からもらったプログラムがコンパイルできません。学校ではエラーが出ますが、一応コンパイルは通りました。
家だとコンパイルさえ通りません。環境はBCC developer です。
コレをお願いします
0243デフォルトの名無しさん
2006/10/26(木) 14:06:28学校の環境と自宅の環境は一緒なの?
うちはBCC developer じゃないんだけど
ちなみに関数内の関数宣言は通らないので
外に出したらコンパイル通ったよ
0244デフォルトの名無しさん
2006/10/26(木) 14:21:22学校の環境と自宅の環境は違います。学校のはよくわかりません。
関数を外にだしても動作は変わりませんか?
0245デフォルトの名無しさん
2006/10/26(木) 14:31:35関数 bfs が 関数 breadth_first のデータにアクセスしてるから
それを解決すればおk
俺は bfs の引数に
int *parent, int *blabel, int *queue を追加した
あと出来るならテストデータも示してみて欲しい
正常な動作か判断できないので
コンパイラによっては関数内の関数宣言を許してないからそれが原因かもね
(俺の場合むしろ逆で関数内で関数宣言するコンパイラを知らない)
0246デフォルトの名無しさん
2006/10/26(木) 14:40:09ファイルアップしていただけませんか?
0247デフォルトの名無しさん
2006/10/26(木) 14:53:16アップローだ初めて使ったよぉ
http://sa-wiki.com/upload/src/up0052.txt
こんな感じになった
あくまで処理内容まで理解していないから
そちらの環境で正常動作するかは不明だよ
0248デフォルトの名無しさん
2006/10/26(木) 15:08:08入力データはこんな感じなんですが、
アップして貰ったので実行するとバグってしまいます・・・・
教授がうざい・・・・
0249デフォルトの名無しさん
2006/10/26(木) 15:17:51今デバッグ中・・・ちょっと待ってて
0250デフォルトの名無しさん
2006/10/26(木) 15:50:30ゴメンね
デバッグやったらいくつかミスってた
テスト結果はアップしたテキストにあります
結果はあってますか?確認してください
http://sa-wiki.com/upload/src/up0053.txt
変更点
bfs関数の引数に int *k を追加しました
0251デフォルトの名無しさん
2006/10/26(木) 15:52:58ごめん
main(void) の scanf("%d", &directed); は消してね
俺の環境だとウィンドウすぐに閉じちゃうから入れといただけ
意味は無いから
0252デフォルトの名無しさん
2006/10/26(木) 15:53:03合ってます!まじでありがとうございます。
元のプログラムはプログラムとしてダメだってことですよね?
■ このスレッドは過去ログ倉庫に格納されています