C言語なら俺に聞け(入門篇) Part 29


20 : 2008/06/02(月) 02:58:55
>18
関数に渡すことが出来ないから成り下がるんじゃないよ
関数云々以前にまず成り下がるの

構成概念をよくしらない人は黙ってなさい

36 : 2008/06/02(月) 03:48:17
Cの実行速度が速いって言われるけど理由はなんでですか?
Javaには便利な文字列型があるけどCには無いってのも関係していますか?
VSのように便利・安全なものほど遅いという感じで覚えておけばよかですか?

42 : 2008/06/02(月) 13:24:28
連投になり、申し訳ありません
上記の実行結果:
x * y結果:2
x * y結果:12
x * y結果:30
j++ * j++結果:1
j++ * j++結果:9
j++ * j++結果:25
関数結果:1
関数結果:4
関数結果:9
関数結果:16
関数結果:25
マクロ結果:1
マクロ結果:9
マクロ結果:25

ここで実行結果を見てx * y結果と関数結果は思った通りになりました
j++ * j++結果とマクロ結果が同じであることも思った通りではありました
ですがなぜ1 9 25と一つとばしなのかがわかりません
j++の度にjが1足されるのだとすれば2 12 30となると思うのですが・・・
ご教示ください

43 : 2008/06/02(月) 13:29:09
後置インクリメント演算子はそれが含まれるステートメントが処理された後に
インクリメントが行われる。
printf(”j++ * j++結果:%d\n”, (j++) * (j++));
は、 jが1としてステートメントを処理した後に、インクリメントが2回行われる。
次のループでは3としてステートメントを処理した後に、というかんじです。
56 : 2008/06/02(月) 18:03:09
C言語なら俺に聞け(入門篇) Part 28
http://pc11.2ch.net/test/read.cgi/tech/1211198816/992-

http://www.kk.iij4u.or.jp/~kondo/bmp /
ここを参考にしたのですが先頭の2バイトに設置されている”BM”が曲者で
ヘッダも14バイトなのでせめて2バイト予備で入れてくれればいいのに・・・
という状況で・・・・

自分のプログラムで使う構造体なら考慮して作りますけどすでにある
共通のフォーマットだとそうもいかなくて無理やりやってるんですよねorz

64 : 2008/06/02(月) 22:20:11
3人のテストの点数がそれぞれ90,45,82(int型)だった。3人の平均点を実数(float型)で求め、少数点以下1桁まで出力するプログラムを書け。

の作成をして頂けませんか‥‥??
手元にemacsがなく、しかし、答え合わせをしたく思います‥!!

74 : 2008/06/02(月) 22:36:09
>>65
あなたは実引数に配列識別子を指定した場合、
関数に対してポインタに成り下がったものが渡ると思いますか?
それとも、配列の先頭アドレスを指すポインタに変換された後、
そのポインタが指すアドレスが渡ると思いますか?
87 : 2008/06/03(火) 00:11:19
課題かなんかで使っちゃダメって言われてないなら問題ないでしょ

int i,j;
COLORREF savecolor[XSIZE][YSIZE];

for(i = 0; i < XSIZE; i++){
  for(j = 0; j < YSIZE; j++){
    savecolor[i][j] = GetPixel(i, j);
  }
}

あとはCSV形式にするだけ

102 : 2008/06/03(火) 06:23:57
mojiのポインタ内に入ってるのはchar型じゃなくてconst char型だから書き換え不可

C++じゃなくてC言語だと書き換えも可能だけど絶対やらない事

136 : 2008/06/03(火) 19:47:24
Sleep()がコンパイラにダメだと言われました、
ミリ秒待たせるにはどうしたらいいでしょうか(T_T)
sleepとか色々な綴りもやりました(;_;)
159 : 2008/06/03(火) 20:46:42
実は簡易的なHTMLの<この中の内容>を取り出す関数を作ろうと思っているのですが、
html->nextはHTMLの内容
#define BODY_SIZE 214
/* <>の切り出し */
html->body = (char *)malloc((size + 1) * sizeof(char));
if(html->body == NULL) goto END;

char *tmp;
while(*html->next++ != ‘<’ && *html->next != ”);
for(int len=0; html->next[len] != ”; len++){
if(html->next[len] == ‘>’){
html->body[len] = ”;
break;}
if(len >= size - 1){
size += BODY_SIZE;
tmp = (char *)realloc(html->body,size);
if(tmp != NULL)
html->body = tmp;
else
goto END;}
html->body[len] = html->next[len];
}
HTMLの<>内を取得していくにあたり、動的なヒープ領域が足りなくなれば、
reallocを使って拡張し、また取得していく、という処理なのですが、
コードが複雑になり、非常に読み難いものになってしまい、
これをもっと簡潔には出来ないものでしょうか?

168 : 2008/06/03(火) 21:18:11
>>167
アイヤー。ごめん。strposはphpですた。
Cだとstrstr?
172 : 2008/06/03(火) 21:31:27
>>171
strstrで二点間(<>)の出現場所を計算して
mallocする、ということでしょうか?
ではstrstrを使わない場合で
>>159のreallocの部分を簡潔にするためにはどうすればいいでしょうか?
186 : 2008/06/03(火) 21:53:51
構造体の仕様とか名前付けのセンスとかでいろいろ察してしまう
個別のタグ内容を割り当てる構造体にファイル全体へのポインタを含めて
そこからデータをコピーしてくるってのは正直気色悪い
196 : 2008/06/03(火) 22:45:12
C言語なんだけど

終了しますか?(Y/N)とか、終了(1)
継続(0)とか、入力をさせる。
んで入力値をscanfで取って判断してるんだけど、
scanfって直前のEnterとか認識不能なコードをストリームに
残しておくとのこと

おかげでバグだらけで困っているのだ…
他にキーボードからの入力を受け取れて不具合の無い関数は無いかな?
初歩くさくてすまんが…

238 : 2008/06/05(木) 00:26:26
いきなり好奇心からCを勉強するのはおバカさん
Cの前にPASCALを勉強することはお利口さん
ただし、ハマるとオ××に転落さん
そこにさえ気をつければ、本当はPASCALから入って欲しいのだが
Cの勉強は、PACALを初歩をマスターしてからという奴
Free-PASCAL/Turbo-Delphi/ラザルス(だったけ)
みたいなフリーな処理系がネットで入手可能だし、条件は
恵まれているのだが…
なにせ、良いPASCALの入門書は絶版に近いのがイタい。
やっぱり××ムの影響だろな。
240 : 2008/06/05(木) 00:58:13
Cは初心者にはかなりハードルが高いプログラミング言語だよ
265 : 2008/06/05(木) 02:52:32
もう四半世紀近くやってきて思ったこと。
経験は絶対的に必要だが、努力や熟練とは異質の世界だなと最近痛感。
足を洗うヨテイ
269 : 2008/06/05(木) 03:12:41
&(tmp[0])はtmpと等価だがtmpをポインタ変数と同一視するのはCでもやめたほうがいい。
Cでは変更不能なポインタ変数というのが無い(C++ではある)から。
仮に実際にそうであっても、変更不能なポインタ変数であるとtmpをコード上で見なすこと
はしないほうがいい。
*(tmp++)とか書けないだろ?だからポインタ変数とまぎわらしい書き方はしないほうがいい。
char配列をchar*型引き数に渡す場合は、(char*)&(tmp[0])とか(char*)&tmpというキャスト
をして値渡し(アドレス値は、ポインタ変数にアサイン可能)する。
353 : 2008/06/05(木) 21:46:10
>>326
キャストは左辺値にも出来ますが何か?
char *p;
void *q;

(char*)q=p;

357 : 2008/06/05(木) 22:00:43
固定長のフィールドからなるレコードを
fgetsした後にsscanfでバラバラにして
フィールド毎にprintfで表示したいんだが
うまくsscanfでバラせてないみたい・・・

AAAAA
BBB
CCCC
こうなって欲しい。

入力ファイル(固定長5、3、4の3フィールドからなる)
AAAAABBBCCCC

381 : 2008/06/06(金) 02:21:47
メモリの動的確保とポインタについて勉強したのですが、
分からないところがあったので質問します

・mallocで確保したメモリは、プログラムの終了と同時に解放されることは保証されているのか
・関数内でmallocで確保したメモリは関数が終了しても解放されず、
 別の関数から参照できることは保証されているか

両方、正常に動くことは確認できたのですが、あらゆる環境・状態で成り立ちますか?

396 : 2008/06/06(金) 12:42:40
問03
学科の出席簿作成。
15人分の学生を表示し、入力により内容を変動させる。

表示順番:
出席表
<入力>学生番号0〜14
<入力>曜日番号0〜6
<入力>時限番号0〜3
<入力>出欠番号0〜1

<入力>学生番号0〜14の時に99を入力するとプログラム終了。
誰かこの問題教えてください。

436 : 2008/06/06(金) 22:03:51
>434
こういうことをやってないかどうか

#include <stdio.h>
void hoge(char *str)
{
  str=”STRING”; /* 間違い */
/* こっちが正解
  strcpy(str, “STRING”);
*/
}

int main(void)
{
  char str[]=”string”;
  hoge(str);
  puts(str);
  return 0;
}

437 : 2008/06/06(金) 22:04:41
>>436
まてそれは大丈夫だろw
438 : 2008/06/06(金) 22:06:36
>>437
落ち着け
444 : 2008/06/06(金) 23:08:26
>>443
for(i=0; i<25; i++) {
j = rand() % (i + 1);
a[i] = a[j];
a[j] = i + 1;
}
こうやるとムダなチェックが必要なくなるよ
452 : 2008/06/07(土) 09:08:43
>>451
商店街のクジ引きなら最後のほうw
459 : 2008/06/07(土) 13:53:49
>>456
マジレスすると、センスないのはお前だ。それは偏る。

<Proof>
N=3とすると、置換の可能性は3^2=27。
一方、3つの要素の並べ方は3!=6。
27/6は整数ではない。故に、偏る。q.e.d.

実際に列[0,1,2]に対して、6万回の試行をしてみると、
[0,1,2]:9063
[0,2,1]:10843
[1,0,2]:11236
[1,2,0]:11121
[2,0,1]:8719
[2,1,0]:9018
この程度のばらつきが出る。

数学的に考えれば、9000前後の数字が出ている列は、
それぞれ並べ替え方27のうち4を占めていて、
11000前後のはそれぞれ27のうち5を占めている。

正確にシャッフルしたければ、並べ替え方が6!のKnuthシャッフルを使うべし。

462 : 2008/06/07(土) 14:01:54
暗号化に関する質問です

char str[] = hairetu //暗号化する文字列
int j = 0; //暗号化する文字列の現在位置

strとjが上記の場合

while(*(str+j) != ’’)

このwhileの条件ってどういう意味ですか
なぜ文字列に位置を示す数を加算できるのですか??

484 : 2008/06/07(土) 16:55:31
>>459
http://pc11.2ch.net/test/read.cgi/tech/1211198816/226
はダメですか?N-BASICの昔からよく目にするからくりですが。
487 : 2008/06/07(土) 17:08:37
恥ずかしながら質問させてください・・・
#include <stdio.h>
int main(void){
int i;
int goukei, tensu[10];
int max = 0;
int min = 999;

printf(”入力された点数の最高点、最低点、平均点を出力するプログラムです。\n”);
puts(”点数を入力してください。”);

for(i = 0; i < 10; i++){
scanf(”%d”, &tensu[i]);
goukei += tensu[i];

if(tensu > max){
max = tensu[i];
}
else if(tensu < min){
min = tensu[i];
}
}
printf(”最高点数は%d、最低点数は%d、平均は%dです。”, max, min, goukei/10);
}

このような感じで、最高点数と最低点数、平均点を出力するプログラムなのですが、
.\1.cpp(18) : error C2446: ‘>’ : ‘int’ 型から ‘int *’ 型への変換ができません。
整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。
.\1.cpp(18) : error C2040: ‘>’ : ‘int [10]‘ は ‘int’ と間接操作のレベルが異なります。
とエラーがでてしまいます。配列を使わなければコンパイルできるのですが・・エラーの文章を読んでもどうしてなのかがわかりません・・・
どうかご教授くださいです・・・

494 : 2008/06/07(土) 22:03:20
こういうmemset()で0で埋めるテクニック(?)って、使ってるやつはどこで覚えるんだろうな。
職場とか、ヘンなサイトとか?
495 : 2008/06/07(土) 22:14:25
>>494
かつて、今はもう時代遅れとなった「固定長の文字列」が使われていたことがあった。
これは、16バイトとか32バイトとかの固定長のフィールドに文字列を書き込んだもので、
それぞれの文字列の長さは最大でもそのフィールドの大きさにしかならないと決まっていた。
そして、フィールドの長さより短いときには、残りをヌル文字が埋めていた。
だから、フィールドに文字列をコピーするときは、あらかじめフィールドを全部ヌル文字で埋めてから、
フィールドの先頭から文字を入れていって、もう文字がなくなったらそこでやめるだけで済んだ。

この仕様の名残がライブラリ関数 strncpy() である。この関数は指定された長さまで文字をコピーし、
文字列の長さが足りないときにだけ、残りをヌル文字で埋める、という一風変わった動作をするが、
これがまさに上で紹介した固定長の文字列を扱うために最適な仕様であった。

そして今でも、そういう古い習慣を引きずってコードを書いているプログラマや、
そういうプログラマに教わったために意味も知らず古い習慣に従っているプログラマがいる。
既に述べたが、今となっては時代遅れであり、やがて消えていくだろう。
もっともそのときにC自体が残っているかどうかは、誰にもわからない。

507 : 2008/06/07(土) 23:22:22
Windowsの構造体をゼロクリアする慣習が広まったんじゃないかな・・・
529 : 2008/06/08(日) 00:11:34
C/C++の宿題スレ見てて思ったんだけど、
a == b のような 条件式は成り立った時必ず 1 が返ると思っていいんですか?
532 : 2008/06/08(日) 00:14:22
プログラミング知識0の状態から
苦しんで覚えるC言語っていうサイトの内容を一通り覚えたんだけど
次何やればいい?
556 : 2008/06/08(日) 08:05:15
>>554
#define DB(x)
とすると
DB(fprintf(stderr,”InitSocket\n”));

;
になります
592 : 2008/06/08(日) 22:55:17
すいませ、うやむやなので、聞かせてください
等価演算子?の質問なんですが
例えばfor文で、 i <= 10 ってのは10までいったら終わるって事ですよね?
if文だと、 i <= 10 、10以下の条件が満たされると思っていいのでしょうか?
601 : 2008/06/08(日) 23:06:52
for( i=1 ; i <10 ; i++){
printf(” * “)
って式だと,
* は11個でるんでしょうか? それとも10個で終わるんでしょうか?
607 : 2008/06/08(日) 23:22:53
試してみましたが10個でした・・・
最初は ++しないで、下に下がるんですよね?
625 : 2008/06/09(月) 00:10:40
>>492
ご丁寧に大変どうもありがとうございます!
なるほど。s2やらをコピーした直後に表示しているから、壊れて出ないけど、
その後、s3がs2の領域を塗りつぶしちゃってるんですね!!
ポインタ苦手すぎて、メモリ操作とか難しすぎて涙が出ます。。
memsetは不要なんですね。よく分からないけど、みんなやってるので、やってただけなんです。
ポインタだから不要ってことですね。大変助かります。ありがとうございます。

strncpy()という関数を教えてくださり、ありがとうございます!
決まった文字数以外は切り捨ててしまって構わないので、これで確実にできると思います。
大変ありがとうございます!!
Cド初心者で、ポインタ操作が苦手なんですが、トークンの先頭を示すポインタの値を
記憶しておく場合、main()に戻ったときに、その値は消えてしまったりしないんでしょうか??
変数の範囲とポインタ関係とかもよくわかってません・・泣

> そうやって切り出した一群のポインタの値を関数の外に持ち出すには、
> ポインタのポインタ(ポインタの配列)を使う必要があることに注意すること。

これが切ないほどによく分からないので、やはり、配列コピーで、
文字列はここにある!と、安心した状態でやりたいと思います。

大変に助かりました!感謝感激!助言くださった皆様も、どうもありがとうございました!
お返事遅くなり、すみませんでした!!m(_ _)m

652 : 2008/06/09(月) 04:02:21
これを実行して一つ目の数値を入力すると
「問題が発生したためtest.exeを終了します」って出るんですが
何がいけないんでしょうか?

#include <stdio.h>

int main(void)
{
int array[10];
int i;

for(i=0;i<10;i++){
printf(”%d番目の数を入力してください:”,i+1);
scanf(”%d”,array[i]);
}

for(i=9;i<0;i–){
printf(”%d\n”,array[i]);
}

return 0;
}

681 : 2008/06/09(月) 19:48:35
なんとなくだけど
voidはmallocで確保した際の戻りアドレスで
nodeは構造体

キャストがうまく出来てない?

696 : 2008/06/09(月) 21:09:24
mallocで確保したメモリ領域のサイズの求め方について分からないので
教えてください。下記のコードでは、出力される結果はchar型へのポインタの
サイズだと思いますが、メモリで確保した領域を取得する関数などは在りますか?

処理系はcygwin + gcc です。ウェブで検索するとmalloc.hにてmalloc_usable_size
という関数が紹介されていたのですが、私の環境では関数がない様でした。

int main (void){
  char *str;

  str = malloc(sizeof(char)*10);
  printf(”sizeof(str)=%d\n”, sizeof(str));

  return 0;
}

また、こういった動的に確保した場合の処理は皆さんはどの様に処理していますか?
やはり、自分でメモリ領域管理変数などを用意するのでしょうか?

710 : 2008/06/09(月) 22:02:31
gccの独自拡張とかc99でよければこうすればsiseofできるようになるけどwwww
int main()
{
int x;
x = 10;
char (*y)[x];
y = malloc(x);
printf(”%d\n”, sizeof(*y));
return 0;
}
716 : 2008/06/10(火) 00:06:55
文系大学生なんですが画像処理のためにC言語を覚えることにしました。
そこで今日書店に指南書を探しにいったのですがいまいちどれもとっつきにくく帰ってきました。
プログラムとはそもそも何かという概念的な事から始まり、揃えるべき環境(ツール)が細かく指定されてる超入門書ってないでしょうか?
729 : 2008/06/10(火) 05:10:54
GOTO文を使うなって学校教えられましたが、
実際の会社のプログラムとかでもやはり使わないのですか?
766 : 2008/06/10(火) 21:31:34
>>765
void main(void) は常に間違いである。
int main(void) または int main(int argc, char **argv) を使え。)
822 : 2008/06/11(水) 02:00:15
>>806
「規格には反しているが処理系によっては動く」ということを間違いでないと断定することは、
ありとあらゆる規格に反する書き方が間違いでないことになる可能性があることに気付いているか。
文法が正しいか正しくないかは、プログラムが動くか動かないかとは本質的に別の問題である。
文法は守るべきものであり、仮に文法に反することが容認されるとしても、それは正しいからではない。
854 : 2008/06/11(水) 05:32:05
intは6byteを返すから
void main(void)で書き始めるのは間違い。
voidはmainだけにつく引数。
正しくはint main()
868 : 2008/06/11(水) 18:11:45
>>867
ありがとうございます。ついでに中の上のレベル位までで、
プログラムの実力ってどんなもので計られるんですか?関数の暗記量とか。
894 : 2008/06/11(水) 21:32:39
「キーボードから異なる実数を3つ入力し、大きい順に3つの値を
表示させるプログラム」をswitch文を用いて作成せよ。と言われましても・・・唐突だよ。

続けざまにこんな問題も、「キーボードから数値を1つ入力し、実数か整数か自然数か判定し、
当てはまるものすべてを表示するプログラムを作成しなさい」と。

挙句、「フフ、僕の課題は難しいよ(キッパリ)、君達に解けるなんておもってないけどフフンwww(バンバン)」だって・・・
まるっきりどこぞのAAみたいな人だから困る。
でも解けないのは事実だから困る。上の2題、どうかご教授下さい。

916 : 2008/06/12(木) 01:58:23
まだ初心者なものですいません
質問し直します

C言語の開発統合環境で初心者におすすめのものはなにがありますか?フリーソフトでお願いします。

C言語の始めよう というものを今まで使っていました。VisualC++2005は難しくて使えませんでした

920 : 2008/06/12(木) 02:05:05
始めにプロジェクトを作ったりして、プログラムも組んだのですが、すぐにエラーが出てしまい、またファイルをクリックしてC++を開くとビルドが出ません。

というか今までのと勝手が違いすぎてなにがなんやら

学校ではVisualstudioC++ みたいなのを使ってるんですがこれはもの凄い使いやすいです

941 : 2008/06/12(木) 18:04:58
今日の課題がうまくいかなかったので、教えてほしいです。
課題は1から100までの素数をすべて求めるプログラムの作成です。
for文を使うのですが、よくわかりませんでした。ご返答よろしくお願いします。ちなみにLinuxで作成しなければいけません。
977 : 2008/06/12(木) 23:37:56
>>976
ありがとうございます。
少し調べてみます。また、わからなかったら来るのでその時はよろしくおねがいします。
988 : 2008/06/13(金) 21:37:30
>>985
例を教えてください。C89でどんな例で困るのかに興味があります。

Cool site: http://sum2cha.blogpico.com :sent by ur frnd

Share This Post
Post a Comment
*Required
*Required (Never published)
 

*
To prove you're a person (not a spam script), type the security word shown in the picture.
Anti-Spam Image