C言語なら俺に聞け(入門篇) Part 18at TECH
C言語なら俺に聞け(入門篇) Part 18 - 暇つぶし2ch900:894
07/09/16 13:16:21
>>896
その話は聞いたことあるが、そういうレベルじゃない。
reallocその物を使わないで済ませられるような場面でやってるだよ。



901:デフォルトの名無しさん
07/09/16 15:00:29
realloc()って新たに確保した場所にそれ以前のものをコピーするんじゃなかったっけ?
毎回やっているかは知らんが

902:デフォルトの名無しさん
07/09/16 15:06:55
>>901
元の領域に連続した領域を確保できれば、単純な拡張でよいので、
コピーは省略出来る。

903:デフォルトの名無しさん
07/09/16 15:09:04
>>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;
}

904:デフォルトの名無しさん
07/09/16 18:10:12
巨大な配列を宣言時に同じ値で初期化したいんですけどこういう場合に簡略化する書き方とかないですかね
void func()
{
static int array[3000] = { 0, .. ,0};
}

的な…


905:デフォルトの名無しさん
07/09/16 18:20:31
{0}
っていうかstaticって自動的に0で初期化されなかったっけ?

906:デフォルトの名無しさん
07/09/16 18:33:31
サンクス。うまくいきますた。

907:デフォルトの名無しさん
07/09/16 18:43:25
グローバル変数、静的変数は宣言時に全ての要素が 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なんかを使えばいい。


908:デフォルトの名無しさん
07/09/16 20:37:21
>>904
staticなら自動的に0で初期化される。
関数内staticにするなら、他の値は難しいな。
呼び出しの都度初期化でいいならmemsetとかでも良いだろうけど。



909:デフォルトの名無しさん
07/09/16 20:39:25
複数ファイルにソースを書くときのお作法を知りたいんだけど、わかりやすいところないかな

910:デフォルトの名無しさん
07/09/17 01:00:33
>>909
ヘッダファイルから書き始める

911:デフォルトの名無しさん
07/09/17 02:30:43
新しくコード書くとき
既存のファイルに加えるか
新しくファイル作成するか迷うんだけど
どういう基準でやったらいいですか?

912:デフォルトの名無しさん
07/09/17 10:25:01
設計上モジュールが分かれてたらファイルを分ける。
CUnit使うなら1ファイルに1関数。

913: ◆7qRx8xrwgo
07/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'
とエラーが出たのですが、どうすればエラーが表示されなくなりますか?

914:デフォルトの名無しさん
07/09/17 11:53:04
>>913
表示

出力

915:デフォルトの名無しさん
07/09/17 11:55:23
「表」の後ろに¥を入れれば直るかも。

916:デフォルトの名無しさん
07/09/17 11:59:13
OSとコンパイラは何?

917:デフォルトの名無しさん
07/09/17 12:03:44
>>913
文字コード Shift-Jis の時
[表示] = 0x95 0x5C 0x8E 0xA6
0x5C = '\\'
0x8E = 0216 <- 8進数

\216 を解釈しようとして、そんなエスケープシーケンスがないという
*警告*がでているだけ

日本語対応しているコンパイラを使うほうが楽

918:913 ◆7qRx8xrwgo
07/09/17 12:16:57
>>914
本に表示と書いてありました

>>915
失礼ながら半信半疑で試したところ、仰るとおり直りました。

>>916
OS:Wndows XP HE SP2
コンパイラ: gcc(Cygwin)

>>917
解説ありがとうございます。今はコンパイラを変えたくないのでこのままでいこうと思います。
もしよろしければ、「表示」のように、気をつけた方がいい単語が他にもありましたら教えてください。

919:デフォルトの名無しさん
07/09/17 12:22:35
>>918
―ソЫⅨ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃

920:デフォルトの名無しさん
07/09/17 12:26:19
gcc に --input-charset=cp932 --exec-charset=cp932 オプションをつけてみ

921:デフォルトの名無しさん
07/09/17 12:32:32
>>920 thx
MinGW (GCC.EXE (GCC) 3.4.2 (mingw-special)) でもいけたよ
さっそく CFLAGS に追加しておいた

922:918 ◆7qRx8xrwgo
07/09/17 12:36:56
>>920
仰るとおりに実行した所エラーが表示されることも無くコンパイルできました。感謝です。

923:デフォルトの名無しさん
07/09/17 12:41:51
皆さん、実際にC言語でどのようなソフトを書かれているんですか?



924:デフォルトの名無しさん
07/09/17 12:51:00
OS書いていますけど?

925:デフォルトの名無しさん
07/09/17 12:53:14
通信プロトコル。
OSIでデータリンクからセッションぐらいまで

926:デフォルトの名無しさん
07/09/17 12:55:28
どこにもしようしているおえすめいかいてない
あおえすをしいでかいてるのか
すごいなおまえ

927:デフォルトの名無しさん
07/09/17 13:01:33
C言語は学校の授業や課題でしか使わんな
普段使うのはVC++かJavaかC#

928:デフォルトの名無しさん
07/09/17 14:43:27
>>923
去年、一年くらい、10年くらい前に作られたシステムの保守要員やらされて、辟易した。

929:デフォルトの名無しさん
07/09/17 16:20:36
保守ってどんなことやるの?

930:デフォルトの名無しさん
07/09/17 16:40:25
>>929
お客さんとこのシステムの構成が変わったりなんか要望があったら、それにあわせてコードを書き換えたりとか。
新規のお客さんもあったけど、すでにあるコードから必要なコードをコピペして、ちょっといじって
もって行ったりとかするだけ。

931:デフォルトの名無しさん
07/09/17 16:45:13
ものすごくつまんなそうな仕事ですね

932:デフォルトの名無しさん
07/09/17 16:57:41
つまらないうえに、すごいつらかった。
基本的にソースコードぐちゃぐちゃだし。


933:デフォルトの名無しさん
07/09/17 17:06:15
今の現場、つまらないうえに、すごいつらい。
基本的にソースぐちゃぐちゃだし。

934:デフォルトの名無しさん
07/09/17 18:32:30
既存のファイルのファイルスコープにある変数や関数を使いたい、
っていうんじゃないんだろうから、迷ったら別ファイルでいいんじゃないでしょうか?

ファイルを分ける弊害って、なにかあるでしょうか?


935:934
07/09/17 18:35:31
リロードわすれてたっはっは~

936:デフォルトの名無しさん
07/09/17 21:35:29
>>933
でも、大事な仕事だよ。
今後はC言語でも保守の仕事が増えるんじゃないか!?
COBOLはすでにそうなっている。

しっかりとしたコーディング規約があって、その通りに作られていればいいんだが、
Cでの開発プロジェクトにはコーディング規約がないくて、各自各様のスタイルでコーディング
していることが多い。最近はそうでもないかもしれないけどね。

937:933
07/09/17 22:09:47
>>934>>911に対するレス?

>>936
スタイル云々以前の問題でね、多分プログラミング自体の経験が無い人か、
少なくとも、スコープを分かってない人が書いたプログラムで、それが原因のバグとかもある。
おそらくテストもマトモにしてないと思われるよ。orz

>>911
で、「分ける分けない」て話は、スコープとも関わる話なのでスコープを理解すること。
関連性が強い物、似たような機能のものを集めるという分け方もある。
「モジュール強度 結合度 独立性」という言葉を調べると何かわかるかも。


938:デフォルトの名無しさん
07/09/17 22:18:54
>>937
「モジュール強度 結合度 独立性」
なつかしい言葉だね

939:デフォルトの名無しさん
07/09/18 01:53:17
何方か、標準関数とポインタ変数についてを詳しく教えてくださる方はいらっしゃいますか?
自分が持ったいた参考書がこの2つの内容が掲載されてた部分が破けていて分からなくて困っています^^;



940:デフォルトの名無しさん
07/09/18 02:00:19
>>939
ポインタ
URLリンク(www.geocities.jp)
標準関数
URLリンク(always-pg.com)

941:デフォルトの名無しさん
07/09/18 02:05:59
940>有難う御座います

942:デフォルトの名無しさん
07/09/18 02:07:38
>>940
>「&」をアドレス演算子といいます。「&」がアドレスを表すので「"アンド"レス」と覚えておくと分かりやすいかも知れません。
なごんだ(´ー`)

943:デフォルトの名無しさん
07/09/18 02:10:59
今更Cなんて初めて使う機会ないよ
OSやドライバを作るなら必要だが、そのレベルに達するまで恐らく5年以上は掛かるだろう




944:デフォルトの名無しさん
07/09/18 02:13:02
がんばれば30日でできるらしいぞ

945:デフォルトの名無しさん
07/09/18 02:14:40
あれかw

946:デフォルトの名無しさん
07/09/18 02:23:30
C言語の言うことなら何でも聞きます

947:デフォルトの名無しさん
07/09/18 02:58:03
URLリンク(always-pg.com)
こちらの「文字列の文字数を求める」サンプルプログラムですが、
"Cプログラム" の長さは 6 が返るはずなんですが 11 が返ります。
なぜでしょうか? 環境は、linuxで gcc 3.3.6 です。


948:デフォルトの名無しさん
07/09/18 03:01:06
全角は2文字

949:デフォルトの名無しさん
07/09/18 03:26:23
ちょっと語弊を招きかねない回答だなw
全角文字は2バイトなのでC標準のstrlenのようにバイト数を返す関数を使用した場合、文字数が得られるとは限らない。
ちゃんとロケールを設定すれば6になるはずだが?一字一句間違えずにコピペした?

950:デフォルトの名無しさん
07/09/18 03:31:49
>>949
ダウンロードして展開した wcslen.c というファイルを euc-jp-unix にしてから
そのままコンパイルして実行してます。

951:デフォルトの名無しさん
07/09/18 03:58:59
>>947-950
試してみたが、VC++では 6 が返ってきた。
cygwin gcc 3.4.4 ではコンパイルできなかった。
L"Cプログラム"; の L でパースエラー。

952:デフォルトの名無しさん
07/09/18 04:14:27
え?ってかCなの?C++じゃなくて?
C標準に2バイト文字なんて概念あったっけ?

953:デフォルトの名無しさん
07/09/18 04:22:59
wchat_t

954:デフォルトの名無しさん
07/09/18 07:52:09
質問させてくださりませ。
void parse_long_options (int _argc,
char **_argv,
const char *_command_name,
...);
の中の"..."の点三つはどういう意味なのでしょうか?
ご教授宜しくお願い致します。


955:デフォルトの名無しさん
07/09/18 08:01:23
>>954
教授じゃなくて教示な

URLリンク(www.geocities.jp)

956:デフォルトの名無しさん
07/09/18 08:30:14
引数の数が可変であるってこと。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch