5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2007/02/20(火) 13:44:34
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 7
http://pc10.2ch.net/test/read.cgi/tech/1170064980/

過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 http://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 http://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 http://pc8.2ch.net/test/read.cgi/tech/1165022193/
Part 6 http://pc10.2ch.net/test/read.cgi/tech/1167325490/

関連スレ
C/C++の宿題を片付けます 83代目
http://pc10.2ch.net/test/read.cgi/tech/1170830498/
くだすれC言語(初心者用)
http://pc10.2ch.net/test/read.cgi/tech/1153542424/l50
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
http://pc10.2ch.net/test/read.cgi/tech/1170338926/
【初心者歓迎】C/C++室 Ver.35【環境依存OK】
http://pc10.2ch.net/test/read.cgi/tech/1171888583/

【C 関数検索 man on WWW】 http://www.linux.or.jp/JM/index.html

2 :デフォルトの名無しさん:2007/02/20(火) 14:30:24
2だ〜

プログラミング勉強しようと思う新1大学生何だけどお薦めの本教えてください。
勉強する順序ってC→C++でいいの?

3 :デフォルトの名無しさん:2007/02/20(火) 14:34:48
順序は目的次第。

C言語よりC++を先に習っても問題ないですか?
http://pc10.2ch.net/test/read.cgi/tech/1130416484/l50

4 :デフォルトの名無しさん:2007/02/20(火) 14:56:55
プログラムを面白く習うならCよりもC++の方が書籍が充実してるなぁ。
小林健一郎や、米村貴裕の本はおもしろい。

5 :デフォルトの名無しさん:2007/02/20(火) 15:07:09
↑の2人ってC言語の本は書いてないの?
出版社は翔泳社がいいっていわれたんだけど・・・

6 :デフォルトの名無しさん:2007/02/20(火) 15:14:55
C言語からやったほうがC++の理論をより深く理解できるんじゃないか?
たいしてプログラミングやったことないのにオブジェクト指向学んでもなぁ・・・

7 :デフォルトの名無しさん:2007/02/20(火) 17:16:43
C++は基本以外にいろいろあるから
Cで基本を押さえてからのほうがいいと思うよ


8 :デフォルトの名無しさん:2007/02/20(火) 18:34:42
C99は後回しでもおk?

9 :デフォルトの名無しさん:2007/02/20(火) 18:44:40
何が言いたいのかわからん

10 :デフォルトの名無しさん:2007/02/20(火) 18:55:53
C言語からC++に移るのって簡単?

11 :デフォルトの名無しさん:2007/02/20(火) 19:13:48
CのようにしかC++を使わないのなら簡単。
が、拡張された機能を使おうとすると大変。
増改築を繰り返して迷路になってしまった旅館って感じの言語仕様だからね。

12 :デフォルトの名無しさん:2007/02/20(火) 20:07:05
迷路っていうかからくり屋敷って感じだ

13 :デフォルトの名無しさん:2007/02/20(火) 20:49:01
ああゲーム作りてえ卒論とかマジうぜえゲームを作る時間を俺にくれええ

14 :デフォルトの名無しさん:2007/02/20(火) 20:49:37
すいません
18年度 第3回
C言語プログラミング能力認定試験 の問題なんですが 解答を教えて下さいm(_ _)m
問6(プログラム説明)
入力した文字列の英大文字を英小文字に 英小文字を英大文字に変換し 表示する(省略)
(アルゴリズム)
@文字列を入力する
A入力された文字列の文字を1字ずつ変換し 出力領域に代入する
英大文字であれば 英小文字に変換し 出力領域に代入する
英小文字であれば 英大文字に変換し 出力領域に代入する
それ以外の文字であれば そのまま出力領域に代入する
B出力領域の内容を表示する

(実行結果)
文字列を入力して下さい Iam21YearsOld
iAM21yEARSoLD

すいません長くて.. プログラムは次です

15 :デフォルトの名無しさん:2007/02/20(火) 20:53:34
宿題スレというのがあるからそこで聞くといいよ

16 :デフォルトの名無しさん:2007/02/20(火) 21:30:24
(プログラム)

/* 大文字・小文字の変換 */
#include <stdio.h>
#include <ctype.h>
main()
{
char str_i[256]、 str_o[256];
int i、j;

/* データ入力 */
printf("文字列を入力して下さい");
scanf("%s"、str_i);

/* 変換 */
for(i=0、j=0;str_i[i] != '\0';i++){
if(isupper(str_i[i]))
str_o[j++]= 【38】;
else if(【39】)
str_o[j++] = 【40】;
else
str_o[j++] = 【41】;
}
【42】;
printf("%s"、str_o);
}

17 :デフォルトの名無しさん:2007/02/20(火) 21:31:46
【38】の解答群
ア tolower(str_i[i]) イ tolower(str_o[j]) ウ toupper(str_i[i]) エ toupper(str_o[j])
【39】の解答群
ア isalnum(str_i[i]) イ isalpha(str_i[i]) ウ islower(str_i[i]) エ isupper(str_i[i])
【40】の解答群
ア tolower(str_i[i]) イ tolower(str_o[j]) ウ toupper(str_i[i]) エ toupper(str_o[j])
【41】の解答群
ア str_i[i] イ str_i[++i] ウ str_i[i++] エ str_i[j++]
【42】の解答群
ア str_o[--j] = '\0' イ str_o[++j] = '\0' ウ str_o[j] = '\0' エ str_o[j+1] = '\0'
以上です
携帯から長々とすいませんm(_ _)m 【38】〜【42】の答えを教えて下さいm(_ _)m

18 :デフォルトの名無しさん:2007/02/20(火) 21:32:47
C/C++の宿題を片付けます 83代目
http://pc10.2ch.net/test/read.cgi/tech/1170830498/

19 :デフォルトの名無しさん:2007/02/20(火) 21:38:21
>>14
38. ア
39. ア,イ,ウ
40. ウ
41. ア
42. ウ

20 :デフォルトの名無しさん:2007/02/20(火) 21:49:01
>>16
C始めて1週間だけど多分できた。islowerとASCLLコードを使うんじゃないかな?
【42】;のところは何も書かないでも出来ちゃったけど

21 :デフォルトの名無しさん:2007/02/20(火) 21:52:02
リロードしてなかった(´・ω・`)
選択肢にないのを記述してた…

22 :デフォルトの名無しさん:2007/02/20(火) 21:58:41
低レベルエスパー

>>20
○ ascii
× ascll

23 :デフォルトの名無しさん:2007/02/20(火) 22:04:38
>>22
書き込んでから気づいた
ハジカシス

24 :デフォルトの名無しさん:2007/02/20(火) 22:22:59
16 の問題を書いた者ですm(_ _)m
すいません どこか間違いらしきとことかありますかね?
19さんの解答で当たってますか?
【39】は どれも当てはまるという事なんですかね?

もう一回プログラムを確認してみます


25 :デフォルトの名無しさん:2007/02/20(火) 22:27:09
1つ言うと「、」じゃなくて「,」

26 :デフォルトの名無しさん:2007/02/20(火) 22:32:15
そうですか 間違いすいませんm(_ _)m
プログラム自体は間違い無いですかね
要は 入力された文字列を 大文字から小文字 小文字から大文字 に変換するプログラムなんですけど
ウは 2つ正解があるんですかね?
【39】はどうなんだろう...

27 :デフォルトの名無しさん:2007/02/20(火) 22:37:34
だから宿題スレに行けってのに何スルーしてんだコラ

28 :デフォルトの名無しさん:2007/02/20(火) 22:38:37
C言語よりまず先にマナーを勉強するべきだと思う

29 :デフォルトの名無しさん:2007/02/20(火) 22:45:34
問題としてはウが正解なんだろうけど、アとイでも実行結果は同じになる。

30 :デフォルトの名無しさん:2007/02/20(火) 23:17:10
宿題スレに書かなくて大変すいませんでしたm(_ _)m
ウは3つ正解ですか??

31 :デフォルトの名無しさん:2007/02/20(火) 23:20:22
ウは選択肢であって設問ではないから、「ウは3つ正解ですか???」というのは
日本語としておかしい。

32 :デフォルトの名無しさん:2007/02/20(火) 23:23:23
解答を全部ウにしたら3つ正解ってことじゃね?

33 :デフォルトの名無しさん:2007/02/20(火) 23:24:39
釣りか

34 :デフォルトの名無しさん:2007/02/20(火) 23:47:20
実は >32さんの言う通りで
答えを全部ウにしました... 3つ正解だといいんだけど..

35 :デフォルトの名無しさん:2007/02/21(水) 00:25:53
全部不正解ならいいのに

36 :デフォルトの名無しさん:2007/02/21(水) 00:29:56
#include <stdio.h>
#include <string>

typedef struct _CALORIE{
char name[40];
float value;
} CALORIE;

int calregist(CALORIE *, int);
float calcalc(CALORIE *, int);

int main(){
CALORIE cal[500] = {
{"米飯", 150.3}, {"中華麺", 57.1},
{"蕎麦", 133.3}, {"うどん", 100.0},
{"素麺", 133.3}, {"食パン", 250.3}
};
int cal_num = 6;
int mode = 0;

printf("カロリー計算ツール\n");


37 :デフォルトの名無しさん:2007/02/21(水) 00:30:31
while(1){
printf("登録は1を、計算は2を、終了は0を入力して下さい : ");
scanf("%d", &mode);
if(mode == 0)
break;
else if(mode == 1)
cal_num = calregist(cal, cal_num);
else if(mode == 2)
printf("総カロリー:%6.2fkcal\n\n", calcalc(cal, cal_num));
}
return 0;
}

/************************************
calregist() カロリーリストへ登録する
[引数] pcal -- カロリーリストへのポインタ
num -- 登録前のリストの要素数
[戻り値] 登録後のリストへの要素数
*************************************/
int calregist(CALORIE *pcal, int num){
printf("食品名を入力して下さい : ");
scanf("%s", (pcal+num)->name);
printf("その食品のカロリーを入力して下さい。[kcal/100g] : ");
scanf("%f", &((pcal+num)->value));
printf("登録しました。\n\n");
return num+1;
}



38 :デフォルトの名無しさん:2007/02/21(水) 00:31:09
/************************************
calcalc() カロリーを計算する
[引数] pcal -- カロリーリストへのポインタ
num -- リストの要素数
[戻り値] カロリー数
*************************************/
float calcalc(CALORIE *pcal, int num){
char name[40]; /* 入力した食品名 */
float gram; /* 入力したグラム数 */
float totalcal = 0.0; /* 合計カロリー */
int i;

printf("--食品一覧----------\n");
for(i=0; i<num; i++)
printf("%s\t", (pcal+i)->name);
printf("\n-------------------\n");

while(1){
printf("食品名(endで計算) : ");
scanf("%s", name);
if(strcmp(name, "end") == 0)
break;
printf("グラム数 : ");
scanf("%f", &gram);
for(i=0; i<num;; i++){
if(strcmp(name, (pcal+i)->name) == 0){
totalcal += (pcal+i)->value * gram / 100.0;
break;
}
}
}
return totalcal;

39 :デフォルトの名無しさん:2007/02/21(水) 00:32:25
}

c:\source>bcc32 CL.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
sample21.c:
エラー E2188 sample21.c 74: 式の構文エラー(関数 calcalc )
エラー E2379 sample21.c 74: ステートメントにセミコロン(;)がない(関数 calcalc
)
*** 2 errors in Compile ***

エラーの解決ができませんので、ご指摘お願い致します。

40 :デフォルトの名無しさん:2007/02/21(水) 00:37:02
>for(i=0; i<num;; i++){

41 :デフォルトの名無しさん:2007/02/21(水) 00:38:45
> #include <string>

#include <string.h>
ちゃんとコンパイルかけたソースそのまま貼ったか?

> for(i=0; i<num;; i++){

for(i=0; i<num; i++){
BCC って不親切なエラーメッセージ出すな。

42 :デフォルトの名無しさん:2007/02/21(水) 00:39:10
長いのはどっかのうpローダーに上げた方がいいと思う

43 :デフォルトの名無しさん:2007/02/21(水) 00:45:31
TIFFファイルを解析して表示させるプログラムのサンプルってどこかにないでしょうか。
ググって探してみたんだけど、どこにも…。

44 :デフォルトの名無しさん:2007/02/21(水) 00:49:04
>>43
libtiffに不満があって自分で作っちゃおうって人?

45 :43:2007/02/21(水) 00:59:00
>>44
libtiffは知らなかった…。

見た感じ不満はなさそうなんだけど、
ただ、出来れば標準ライブラリ以外は使いたくないと思ってて。

46 :デフォルトの名無しさん:2007/02/21(水) 01:08:44
>>45
自力でtiffを解析するサンプルを載せてるようなサイトはあまりないかも。
となると、tiffの仕様を読んで自分で作るしかないような。
tiffの仕様はlibtiffのサイトから辿れるよ。

47 :デフォルトの名無しさん:2007/02/21(水) 01:17:16
つーか、libtiffをサンプルとするのに何が不満なんだろう。

48 :デフォルトの名無しさん:2007/02/21(水) 01:17:18
文末にセミコロン;つけるときとつけないときがあるよね?つけるときが多いけど。
それのつけるときとつけないときってどう違うの?イマイチわからない。凄く初歩的でごめん。

49 :デフォルトの名無しさん:2007/02/21(水) 01:20:24
>>48
適当にソースを眺めてれば、規則性がわかるんじゃね?

50 :デフォルトの名無しさん:2007/02/21(水) 01:21:10
>>48
日本語で例えると、
読点:「,」→「、」
句点:「;」→「。」
てな対応になってる。

51 :デフォルトの名無しさん:2007/02/21(水) 01:21:12
libtiffをサンプルにするならlibtiffを使えばいいじゃん
libtiffからソースをパクって使うってことかね

52 :デフォルトの名無しさん:2007/02/21(水) 01:21:14
文の終わりにはセミコロンがつきます

53 :デフォルトの名無しさん:2007/02/21(水) 01:21:37
文末には必ずつける。以上。
但し、プリプロセッサディレクティブは文ではない。

54 :デフォルトの名無しさん:2007/02/21(水) 01:22:37
> 文末にセミコロン;つけるときとつけないときがあるよね?
んなこたあない。
文末を表す記号がセミコロンだ。

55 :デフォルトの名無しさん:2007/02/21(水) 01:23:53
もしかして:Pascal

56 :デフォルトの名無しさん:2007/02/21(水) 01:25:15
ブロックの後ろにはつけないから、それを言ってるんじゃね?

57 :デフォルトの名無しさん:2007/02/21(水) 01:30:34
C言語の構造は、
式文→式;
複文→{ 複数の文 }
if文→if (式) 文
while文→while (式) 文
関数定義→いろいろ宣言 文
のように文法的にどういう形になるか決められていて、
それによって;がいるか要らないかは判断できる。



58 :デフォルトの名無しさん:2007/02/21(水) 01:31:16
ごめん書き方がわるかった。
>>56
多分それだ。ブロックって言うと・・・例えばどんなのだっけ。

59 :デフォルトの名無しさん:2007/02/21(水) 01:43:18
ヘッダファイルって#defineの集まりだと思っていい?

60 :43:2007/02/21(水) 01:43:34
>>46
ありがとう。
その辺から辿ってみるよ。


>>47
別に不満はないよ。
ただ、存在を知らなかったってだけ。

61 :デフォルトの名無しさん:2007/02/21(水) 01:43:44
>>59
よくない

62 :デフォルトの名無しさん:2007/02/21(水) 01:44:22
>>58
>>57で言うと、複文のこと。

63 :36:2007/02/21(水) 01:45:36
>>40
できますた、ありがとうございました。。

>>42
やり方がわかりませんでした。

64 :デフォルトの名無しさん:2007/02/21(水) 01:50:36
>>58
例えばこんなのが不自然とかは分かるのか?

if (条件式);
  処理;

for (i=0; i<N; i++) {
  処理1;
  処理2;
};

65 :デフォルトの名無しさん:2007/02/21(水) 01:59:53
>>64
あ、なるほど。さすがにそれはわかる。
要するに文の途中だから;は入れれないとかそういうやつか。

66 :デフォルトの名無しさん:2007/02/21(水) 02:06:29
>>64
ifの方は不自然とかいう問題以前のような気がする。

67 :デフォルトの名無しさん:2007/02/21(水) 02:12:26
不自然ではないがナンセンスだな

68 :デフォルトの名無しさん:2007/02/21(水) 02:13:43
>>65
> 文の途中だから;は入れれない
>>64はどっちも文法上は正しいコードだぞ

69 :デフォルトの名無しさん:2007/02/21(水) 02:17:17
if (条件式);  if文で何も処理しない
  処理;     普通の文

for (i=0; i<N; i++) {    ありがちなN回ループ
  処理1;
  処理2;
};                  ループ後に何もしない処理

70 :デフォルトの名無しさん:2007/02/21(水) 02:20:27
;だけからなる空文(なにもしない)というものがある。

if (式); は、if (式) 文 の文の部分が;だけからなる空文
if (式) { ... };は、ifに支配されている文は {...} で終わり、そのあとに
if文の次に評価される空文が1つついている解釈になる。

いずれも、文法的には正しい。

式の評価自体に繰り返す意味があって、それ以上実行する必要がある
ものがない場合は、
while (式) ;
のようなループ制御文の文が空文になることも実際にある。


71 :デフォルトの名無しさん:2007/02/21(水) 02:22:58
>>70のような;は見落としやすいので、
while (式)
 ;
のようにぽつんと単独で目立つように書くのがいい。


72 :デフォルトの名無しさん:2007/02/21(水) 02:36:42
{ 〜〜〜〜〜
while (式) ;
 }
はwhile (式) ;から}までを繰り返すってこと?

73 :デフォルトの名無しさん:2007/02/21(水) 02:40:49
('A`)エー

while (条件式) {
  処理1;
  処理2;
   …
  処理N;
}
条件式が真の間のみ、処理1〜Nを繰り返す


なんか参考書とか買って嫁

74 :デフォルトの名無しさん:2007/02/21(水) 02:41:30
>>72
ブロックの有無は関係ない。while()は次に続く文を実行するだけ。

75 :36:2007/02/21(水) 03:04:44
>>num -- 登録前のリストの要素数
これは、どんな感じなのか、イメージが掴めないので
例を出して説明して戴けないでしょうか?

>>return num+1;を返しますが、この+1とは・・・?

ご助言、宜しくお願い致します。

76 :デフォルトの名無しさん:2007/02/21(水) 03:15:04
>>75
初期状態では6個登録されているようなのでnum = 6 (呼び出し元ではcal_num == 6)
で、登録して要素が一つ増えたからnum+1 (戻ってきてcal_numが事実上1増えた)

77 :36:2007/02/21(水) 03:22:44
>>76
あ〜っ!そういう事だったんですね。
とてもわかり易い説明、ありがとうございました。

あと、幾ら考えてもわからないのが
>>while(1){
printf("食品名(endで計算) : ");
scanf("%s", name);
if(strcmp(name, "end") == 0)
break;
printf("グラム数 : ");
scanf("%f", &gram);
for(i=0; i<num;; i++){
if(strcmp(name, (pcal+i)->name) == 0){
totalcal += (pcal+i)->value * gram / 100.0;
break;

この中の
>>if(strcmp(name, "end") == 0)


>>printf("グラム数 : ");
scanf("%f", &gram);
for(i=0; i<num;; i++){
if(strcmp(name, (pcal+i)->name) == 0){
totalcal += (pcal+i)->value * gram / 100.0;
break;

この二つです、何を言ってるのやらです。
因みに、>>*gramはポインタでなく、"掛ける"ですよね?

78 :デフォルトの名無しさん:2007/02/21(水) 03:28:59
strcmpは引数の指しているNUL終端文字配列を比較し、一致すると0を返す。

if(strcmp(name, "end") == 0)
は「nameが"end"だったら」

(pcal+i)->name

(*(pcal + i)).name
の略記法であり、結局は
cal[i].name
のこと。

該当するnameのものをforループで探し、
見つかったら( if (strcmp(name, (pcal+i)->name) == 0) )
計算、もう探す必要はないのでbreakする。



79 :36:2007/02/21(水) 05:02:11
ポインタや引数など理解できてないなで出直してきます
m(__)m


80 :デフォルトの名無しさん:2007/02/21(水) 06:01:36
>>78
せっかくポインタ使うんだからむしろこうしたほうがいいかも。

for(i=0; i<num; i++){
if(strcmp(name, pcal->name) == 0){
totalcal += pcal->value * gram / 100.0;
break;
}
pcal++;
}


81 :デフォルトの名無しさん:2007/02/21(水) 15:12:41
返却値に何も記入しないで

return;

とすると1が戻ってきますが、これはJISとかISOで規定されているのでしょうか?

82 :デフォルトの名無しさん:2007/02/21(水) 15:22:09
規定されていない

83 :デフォルトの名無しさん:2007/02/21(水) 15:52:40
すみません教えてください(;´д⊂)

linuxでwrite()を使ってファイルの書き込みを行なっているのですが、
2G以上のファイルの書き込みを行なおうとハングって落ちちゃいます。

write()では2G以上のファイルは使用できないのでしょうか?


84 :デフォルトの名無しさん:2007/02/21(水) 15:57:30
>>83
どうやってopenしてる?


85 :デフォルトの名無しさん:2007/02/21(水) 15:58:46
2Gなら64bit APIは関係ないし、単に32bit-signed intが負になってるだけじゃ?


86 :デフォルトの名無しさん:2007/02/21(水) 16:13:30
>>84
open()はこんな感じで行なってます。
INT64 fd = open(path, O_CREAT|O_RDWR|O_EXCL, S_IRUSR|S_IWUSR);


87 :デフォルトの名無しさん:2007/02/21(水) 16:22:07
#include <stdio.h>

int main(void)
{
int ch;
FILE *sfp, *dfp;
char sname[64], dname[64]; /* ファイル名 */

printf("コピー元ファイル名:"); scanf("%s", sname);
printf("コピー先ファイル名:"); scanf("%s", dname);

if ((sfp = fopen(sname, "r")) == NULL) /* コピー元をオープン */
printf("\aコピー元ファイルをオープンできません。\n");
else {
if ((dfp = fopen(dname, "w")) == NULL) /* コピー先をオープン */
printf("\aコピー先ファイルをオープンできません。\n");
else {
while ((ch = fgetc(sfp)) != EOF)
fputc(ch, dfp);
fclose(dfp); /* コピー先をクローズ */
}
fclose(sfp); /* コピー元をクローズ */
}

return (0);
}

コピー先のファイルを fileB.c などと拡張子を付けるとうまく生成されません。
拡張子を付けて出力する為にはどのようにすればよいのでしょうか?><

88 :デフォルトの名無しさん:2007/02/21(水) 16:24:26
ファイルポインタは正負あるし、2Gオーバーだと64bit必要。
#define _LARGEFILE_SOURCE
だったっけ。


89 :デフォルトの名無しさん:2007/02/21(水) 16:26:01
>>87
黙って終わってしまい何もコピーできてないのか、
何かエラーがでるのか、それくらい書いてよ。


90 :87:2007/02/21(水) 16:29:12
さらに上記のプログラムをもとに、すべての英小文字を英大文字に変換しながらコピーするプログラムを作成せよとのお題が出ました。
これはASCIIコードから操作すべきなのでしょうか?

91 :デフォルトの名無しさん:2007/02/21(水) 16:32:02
>>90
#include <ctype.h>
islower
toupper


92 :87:2007/02/21(水) 16:34:00
>>89殿
拡張子抜きのファイルは確かに作れるんですが、
.txtだとか.c といった風に拡張子を付けると駄目になります。;
エラーは自分で書いた、「コピー先ファイルをオープンできません」が出ます。


93 :87:2007/02/21(水) 16:36:55
>>91殿
K&R、202ページにて発見いたしました。これから読もうと思います。ありがとうございました。

94 :83:2007/02/21(水) 16:38:47

>>88
#define _LARGEFILE_SOURCE
は指定しています。
ちょっと調べまして、
#define _FILE_OFFSET_BITS 64
も入れてみましたが結果は変わらずです。(´・ω・`)



95 :デフォルトの名無しさん:2007/02/21(水) 16:40:38
>コピー先のファイルを fileB.c などと拡張子を付けるとうまく生成されません。
>>87をコピペしてコンパイルしたけどできたよ。エラーでないよ。

96 :デフォルトの名無しさん:2007/02/21(水) 16:41:02
>>92
errnoでも調べとけよ

97 :デフォルトの名無しさん:2007/02/21(水) 16:42:17
ファイルの20バイト目に文字列を挿入するようなプログラムを考えているのですが、

ファイルを丸ごとプログラムで読み込むようなことをしないで
実行するような方法はないでしょうか?

98 :デフォルトの名無しさん:2007/02/21(水) 16:42:44
>>94
open64とか使わなくていいんだっけ?


99 :デフォルトの名無しさん:2007/02/21(水) 16:43:42
可能性
1. ファイル名に出来ない文字を打った ,カンマ と .ピリオド 間違い等(いつもと違うキーボード使ってるなら)
2. ファイル名の長さ制限に引っかかった

100 :87:2007/02/21(水) 16:46:48
>>95
できた;おれも試したらできました。よかった;;

101 :87:2007/02/21(水) 16:48:42
>ファイルの20バイト目に文字列を挿入するようなプログラムを考えているのですが、
>
>ファイルを丸ごとプログラムで読み込むようなことをしないで
>実行するような方法はないでしょうか?

まさかhtmlを埋め込もうとしてる?

102 :デフォルトの名無しさん:2007/02/21(水) 16:50:39
>>97
fopen "a"

103 :デフォルトの名無しさん:2007/02/21(水) 16:53:44
>>97
書き込んだ位置以降を後ろにずらしたいなら移植性の高い方法では多分無理。

104 :97:2007/02/21(水) 17:06:46
>>101
データベースを更新したりするようなプログラムを考えてます。
その際に挿入とかがどうしても必要になってきまして;;

>>103
では、諦めた方がいいのでしょうか;

今ところ、
作業ファイルのようなものを仮に作成して、
その中でDBをいじって、
更新するときに、作業ファイルを丸ごと元ファイルに書き込むことを考えてますけど、
これくらいが、一番安定でしょうか?

105 :デフォルトの名無しさん:2007/02/21(水) 17:30:52
最後に作業ファイルが要らなくなるなら、
作業ファイルを閉じた後、元ファイル名へ名前を変えるだけでいいと思う。

106 :97:2007/02/21(水) 17:37:13
名前そのものを入れ替え・・・
そうですね そうします

107 :デフォルトの名無しさん:2007/02/21(水) 19:51:49
>>97
ファイルを全部読まなくてもいいんじゃないか?
1バイト読んで作業ファイルに1バイト書いて、というのを繰り返して
20バイト目に来たら作業ファイル側だけに新たな文字列を書いて、
それが終わったらまた1バイトづつ移して最後にクローズしてリネーム。
但し本当にこの通りに1バイトづつやるのであれば fopen(), getc()
putc() でやること。(open(), read(), write() 使わない方が良い。
バッファリングされないから)。


108 :デフォルトの名無しさん:2007/02/21(水) 21:32:53
ライブラリってヘッダファイルのこと?

109 :デフォルトの名無しさん:2007/02/21(水) 21:33:44
再利用するために書かれたプログラム群のこと

110 :デフォルトの名無しさん:2007/02/21(水) 21:42:09
ヘッダファイルにあるのは関数や変数の宣言。
その定義がライブラリに含まれているという場合もある。

111 :デフォルトの名無しさん:2007/02/21(水) 21:47:16
>>109-110
ありがとう。でもまだよく分らない(|||´・ω・`)
もうちょっと調べてくる

112 :デフォルトの名無しさん:2007/02/21(水) 22:59:23
exitと入力されたら終了するようにしたいのですが、これだとexitと入力しても終了されません。
if文では文字列は扱えないのしょうか? 
それとも文字列cの最後の\nか\0かに関係がある?

while(1){
char c[10];
printf("exitで終了\n");
fgets(c,sizeof(c),stdin);
if(c == "exit"){
printf("終了します\n");
break;
}
}

113 :デフォルトの名無しさん:2007/02/21(水) 23:01:56
>>112
>if(c == "exit"){
if(strcmp(c,"exit")==0)

if(stricmp(c,"exit")==0)
としる

114 :113:2007/02/21(水) 23:04:32
>>112
書き忘れたけど
if(c == "exit") だとポインタの比較であって文字列の比較にならない
strcmp か stricmp で比較する

115 :デフォルトの名無しさん:2007/02/21(水) 23:08:23
"exit\n" じゃないとダメな気がする

116 :デフォルトの名無しさん:2007/02/21(水) 23:11:06
""は勝手にヌル終端文字に変換されるんじゃなかったっけ?

117 :113:2007/02/21(水) 23:13:12
>>115
確かに

>>112
↑で


118 :デフォルトの名無しさん:2007/02/21(水) 23:16:20
ありがとうございます。
if(strcmp(c,"exit\0")==0)
で無事できました。ずっと悩んでたんでかなり助かりました

119 :デフォルトの名無しさん:2007/02/21(水) 23:16:41
なんてこった\nと\0見間違えたorz

c[strlen(c)-1]='\0';
これで\n消せばいいんじゃね?

120 :デフォルトの名無しさん:2007/02/21(水) 23:16:41
>>112
#include<stdio.h>
#include<string.h>

int main(void)
{

while(1){
char c[10];
char a[10];
printf("exitで終了\n");
fgets(c,sizeof(c),stdin);
sscanf(c,"%s", a);
if(strcmp(a,"exit") == 0){
printf("終了します\n");
break;
}
}

これで上手くいくと思うよ。俺んとこだと、sscanf を sscanf_s にしろと言われるが、
どっちでもいい。

121 :113:2007/02/21(水) 23:22:56
>>118
ホントにそれでいけたの?

122 :デフォルトの名無しさん:2007/02/21(水) 23:24:08
すみません打ち間違えてました\0=\n
ソースの方にはちゃんと\nって打ってた

123 :113:2007/02/21(水) 23:31:23
>>122
そですか
でも strcmp は大文字小文字を区別します
stricmp の方は大文字小文字を区別しませんのれ
EXIT でもおkにするなら stricmp に変える

124 :デフォルトの名無しさん:2007/02/21(水) 23:38:14
EOF 打たれたらどうするんだろ

125 :デフォルトの名無しさん:2007/02/21(水) 23:45:21
引数の値渡しと参照渡しが理解できませんので
簡単に説明お願い致します。特にポインタを使った
参照渡しが解説を読んでもピント来ません。


126 :デフォルトの名無しさん:2007/02/21(水) 23:55:33
Cって値渡ししかないんじゃなかったっけ?
ポインタを使ってもアドレスという値を渡してるだけだし。

127 :デフォルトの名無しさん:2007/02/21(水) 23:56:43
http://www9.plala.or.jp/sgwr-t/c/sec09.html

(2)2次元配列データの取り扱い方の欄で
int no[3][4]の図解の説明で、どうして
[0][0]は1 no[1][2]は6で足して7になるのでしょうか?

128 :デフォルトの名無しさん:2007/02/22(木) 00:02:52
>>126
「参照を値渡しする」ことを「参照渡し」と言ってしまう人が多いんだよ。


129 :デフォルトの名無しさん:2007/02/22(木) 00:03:18
>>125
・文系向け
銀行に行きます。値渡しは行員が貸金庫からお金を出してきてくれます。お金を使える事はできても貸金庫内は弄れません。
参照渡しは行員が貸金庫の場所を教えてくれます。中身が何であろうと、どう使おうと自由です。

・理系向け
値渡しが変数のアドレスに格納されている値を関数に渡すのに対し、
参照渡しは変数のアドレスを渡します。アドレス値そのものの書き換えはできなくても
ポインタが指す値や配列などの前後の値を自由に読み書きできます。

実質的にはポインタを渡す場合は、
変数の内容を書き換えしたいときか、配列・文字列を扱うとき、構造体などの大きなデータを渡すとき
などです

130 :デフォルトの名無しさん:2007/02/22(木) 00:04:30
>>127
1と6を足したら7だと思うが、どうなると思ったの?


131 :デフォルトの名無しさん:2007/02/22(木) 00:05:13
>>127
1+6=7になるからじゃないのかい?
no[0][0]=1;
no[1][2]=6;
no[2][3]=no[0][0]+no[1][2];
の代わりに、
a=1;
b=2;
c=a+b;
でcになぜ7が入るの?って聞いているようなもの。

132 :113:2007/02/22(木) 00:05:29
>>125
Cだと参照渡しできません

>>127
1+6 は 7 ですよ
まぁそんなこと聞きたいわけじゃないと思いますけど
もうすこし、解説読んだほうがいいかと

133 :デフォルトの名無しさん:2007/02/22(木) 00:06:43
>>132
C++では参照という言葉に言語固有の限定した意味があるから、
そこから離れて説明しないといけないぜ。


134 :127:2007/02/22(木) 00:06:58
>>130
このページの図解では、[0][0]は1 no[1][2]は6
何故[0][0] = 1; no[1][2] = 6;なのかがわからないのです
唯単に宣言しているからでしょうか?

135 :デフォルトの名無しさん:2007/02/22(木) 00:08:02
代入してるから

136 :113:2007/02/22(木) 00:11:00
リロード遅れた
>>128
あれま
私はてっきり
void func(int &)
がしたいのかと思ったよ
void func(int *)
ってことかね?

>>133
ちょっと面倒ですね

>>134
例、たとえだと思いますよ
別にno[1][0] = 1; no[1][3] = 6; no[0][2]=no[1][0] + no[1][3] 、でも良かったんだと思います


137 :125:2007/02/22(木) 00:14:15
>>129
わかりやすい説明、ありがとうございます

>ポインタが指す値や配列などの前後の値を自由に読み書きできます。
>変数の内容を書き換えしたいときか
これの内容について、更に解説戴けると幸いです。


138 :127:2007/02/22(木) 00:16:01
ありがとうございました、皆さん

139 :デフォルトの名無しさん:2007/02/22(木) 00:25:42
>>136
ここはいちおうC言語スレなんで

140 :113:2007/02/22(木) 00:32:15
>>139
どちら様?

141 :デフォルトの名無しさん:2007/02/22(木) 00:52:56
今月すごい暇だからCを学ぼうと思うんだけど
何からはじめたら良い?

142 :デフォルトの名無しさん:2007/02/22(木) 00:57:23
あと一週間しかないじゃん

143 :デフォルトの名無しさん:2007/02/22(木) 01:00:55
今月は凄い暇だけど来月は割と暇
本当にやることないからちょっと齧ろうと思うんだけど甘いか?

144 :デフォルトの名無しさん:2007/02/22(木) 01:04:46
とりあえず、入門サイトをググって最低限の環境整えてやってみろ
で、面白ければ(多分無い)もしくは嫌いではなければ入門書買うなりなんなりと

145 :デフォルトの名無しさん:2007/02/22(木) 01:08:26
>>143
いや、そんなことはない。
一週間超暇でCの学習に集中するなら、かなり進むことができる。
いい参考文書、いい先達、モチベーションの強固な維持、そして少しのプログラミングセンスがあれば。

146 :デフォルトの名無しさん:2007/02/22(木) 01:12:49
>>141
学生?
なんとなくでも「こんなことしてみたい」って目標があるならまだしも
とりあえず、だと飽きると思うな……
他のプログラミング言語の経験があるなら全く問題なく出来るとは思うけど。

寧ろ、「エクセルでできる〜」とか「エクセルでわかる〜」とかで
遊んだ方が為になることも多いかも試練(スレ違いスマソ

147 :デフォルトの名無しさん:2007/02/22(木) 01:13:55
>>144-145
おk、適当にやってみる
本当にただの思いつきで今までプログラムなんてやったことないから多分続かないけど

ところでオススメの参考書ってある?

148 :デフォルトの名無しさん:2007/02/22(木) 01:16:10
>>146
一応まだ学生
長い春休みなんだけど遊ぶ人もいないくて暇
どうせだったらこの時間を有意義に使おうとおもって

エクセルからはじめたほうがいいってことかな?

149 :デフォルトの名無しさん:2007/02/22(木) 01:18:24
すごいな。プログラミングの単位落とした俺でも春休みは遊びまくるってのに。

150 :デフォルトの名無しさん:2007/02/22(木) 01:21:22
>>147
読んでないけど結城浩のC言語プログラミングレッスン2冊あたりは
どうだろうね。

まー、ここにも行ってみそ。

推薦図書/必読書のためのスレッド PART33
http://pc10.2ch.net/test/read.cgi/tech/1167140188/


151 :デフォルトの名無しさん:2007/02/22(木) 01:21:46
いや、関連性は一切無い。
たまたま俺がやってて楽しかったからだw
ttp://www.amazon.co.jp/Excel%E3%81%A7%E9%81%8A%E3%81%B6%E6%89%8B%E4%BD%9C%E3%82%8A%E6%95%B0%E5%AD%A6%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-%E7%94%B0%E6%B2%BC-%E6%99%B4%E5%BD%A6/dp/4062574306
まあVBAは絶対にオススメしないけど。

マジレスすると、Cやって役に立つような職業よりも
エクセルが役に立つ職種が多い気がする
ただそれだけ。

これまでプログラミング経験が無いんだったら、Cは最初には向かないかもしれん。
http://pc10.2ch.net/test/read.cgi/tech/1075035410/
http://pc10.2ch.net/test/read.cgi/tech/1152778344/

152 :デフォルトの名無しさん:2007/02/22(木) 01:25:26
>>149
マジか
いや遊びまくりたいところなんだけどいつも遊んでた奴がバイトはじめたりなんだかんだで
なんか家でずっと一人でネットばっかやってるのが虚しくなったからさ
>>150
ありがとう、後でじっくり読んでみる
>>151
そうなのか
プログラムっていったらCとかしか聞いたことなかったから解らんかった
初めてやるならなにがいいのかな?

153 :デフォルトの名無しさん:2007/02/22(木) 01:30:12
>>152
やる気があるならC言語が最適

154 :デフォルトの名無しさん:2007/02/22(木) 01:36:48
どうせ時間は腐るほどあるので長い目で見てCでもやってみます
みんなありがとう

155 :デフォルトの名無しさん:2007/02/22(木) 01:43:43
int型数値を3,221のように3桁カンマ区切りで文字列変換してくれる標準関数ってありましたっけ?
なければ自分で作ります

156 :デフォルトの名無しさん:2007/02/22(木) 01:54:55
printfで'フラグを使える処理系もあるが、標準Cにはない。

157 :デフォルトの名無しさん:2007/02/22(木) 02:09:19
http://www9.plala.or.jp/sgwr-t/c/sec10-3.html

文字列とポインタがわかりません、説明は読みました
前の変数と配列のポインタは理解できました

>>>10−3.ポインタと文字列
普通ポインタを用いるときには、配列などのアドレスをポインタに設定して用いますが、
文字列の場合には、配列を使わずにメモリ上に取られた文字列のアドレスを
直接ポインタに指定することができます。

これがわかりませんので、解説よろしくお願いいたします。

158 :157:2007/02/22(木) 02:15:12
因みにポインタのポインタは理解できました(図解を見て)

ポインタと文字列で
>>>>>>10−3.ポインタと文字列
普通ポインタを用いるときには、配列などのアドレスをポインタに設定して用いますが、
文字列の場合には、配列を使わずにメモリ上に取られた文字列のアドレスを
直接ポインタに指定することができます。

これで、普通の"変数や配列のポインタ"と、"ポインタと文字列 "の違いがわかりませんです。

159 :デフォルトの名無しさん:2007/02/22(木) 02:34:05
変数や配列のポインタ"と"ポインタと文字列の違い
 → ありません。全てアドレス値です。そもそも文字列というのはchar型配列(の先頭のポインタ)

"ABC"みたいのでもメモリ上に変数が作られると考えればいい。文字列は配列なので先頭のポインタを取得すればいい
""で先頭のポインタが取得できるのでポインタ変数にあたかも文字列を代入しているように見える
よってconst char *hoge[N]みたいなので文字列定数の配列が作れます。

160 :デフォルトの名無しさん:2007/02/22(木) 02:34:35
本来、
 int *array = { 1, 2, 3, 4, 5 }; // エラー
こういうことはやったらおこられるが、
文字列ならおkとかそういう意味。
 char *p = "ABC"; // おk

別にポインタそのものには違いはない。

161 :デフォルトの名無しさん:2007/02/22(木) 03:18:34
>>156
サンクス自分で作る

162 :デフォルトの名無しさん:2007/02/22(木) 03:23:01
>160
その説明だと、
char *p = "ABC";
*p = 'D';
とか平気でやるようになりそうだ。

163 :デフォルトの名無しさん:2007/02/22(木) 03:32:47
>>157
は前スレの人だな
未だまともな本買わずに、サイトとか見てるのか。

164 :デフォルトの名無しさん:2007/02/22(木) 03:46:10
>>162
それがダメなのはchar *pが暗黙にconstとして宣言されているからですか?

165 :157:2007/02/22(木) 03:59:51
>>159->>159
では、大した違いが無く気にせずでいいんですね。
サンクスでした

>>163
良い本が見つからず、どれを買うか悩んでいます
ここで紹介された本は書店では見当たりません
今のところ、上で挙げたサイトが最良です


166 :157:2007/02/22(木) 04:12:50
>>>配列を使わずにメモリ上に取られた文字列のアドレスを
直接ポインタに指定することができます

この解説が
>>>"ABC"みたいのでもメモリ上に変数が作られると考えればいい。文字列は配列なので先頭のポインタを取得すればいい
""で先頭のポインタが取得できるのでポインタ変数にあたかも文字列を代入しているように見える

>>int *array = { 1, 2, 3, 4, 5 }; // エラー
こういうことはやったらおこられるが、
文字列ならおkとかそういう意味。
 char *p = "ABC"; // おk

この二つでいいのですよね?
もう一度だけ、例文を用いて解説して戴けると、ありがたいです。




167 :デフォルトの名無しさん:2007/02/22(木) 04:13:33
>>164
その場合の挙動が標準規格で未定義だからです。

168 :デフォルトの名無しさん:2007/02/22(木) 05:02:54
>>167
ありがとうございます。
足を踏み入れてはいけないところに行ってしまったみたいで
ちょっとびびりますた。

169 :デフォルトの名無しさん:2007/02/22(木) 06:05:45
クリップボードに文字を出力など、クリップボードを弄りたいんですがどうすればいいんでしょうか?

170 :デフォルトの名無しさん:2007/02/22(木) 06:09:12
>>169
OSは?


171 :デフォルトの名無しさん:2007/02/22(木) 06:09:34
WinXPです

172 :デフォルトの名無しさん:2007/02/22(木) 06:10:42
じゃあこっちじゃない?

Win32API質問箱 Build50
http://pc10.2ch.net/test/read.cgi/tech/1171721448/


173 :デフォルトの名無しさん:2007/02/22(木) 06:14:54
ありがとう。そっちいってきます

174 :デフォルトの名無しさん:2007/02/22(木) 11:36:45
struct nannka{
char name[20]; char name2; int No; int time; char nurupo[10];・・・・
}

みたいな感じでcharやintなんかがごっちゃになってる構造体を
ポインタ操作か何かで
順番に指定していくことってできますか?

175 :デフォルトの名無しさん:2007/02/22(木) 11:50:34
構造体を順番に指定するのと、構造体の要素を順番に指定するのは全く違う。

176 :デフォルトの名無しさん:2007/02/22(木) 11:58:59
>>174

>構造体を順番に指定
struct nannka a, b, c;
struct nannka p[] = {&a, &b, &c};

>構造体の要素を順番に指定
struct nannka a;
void * p[] = {a.name, & a.name2, & a.No, & a.time, a.nurupo};

177 :デフォルトの名無しさん:2007/02/22(木) 12:13:48
要素の方です。
ありがとうございます。
早速試させていただきます。

178 :デフォルトの名無しさん:2007/02/22(木) 12:22:01
指定したからと言って何ができるわけでもないことに注意。

179 :デフォルトの名無しさん:2007/02/22(木) 14:07:52
char name[20]; char name2; int No; int time; char nurupo[10];
こういう型の異なる構造体のメンバにポインタを使って順番にアクセスする意味があるのだろうか?
結局、そのメンバが文字列なのか整数型なのか判断する必要があるわけだし
名前でアクセスしたほうがソースも見やすいと思うけど

180 :デフォルトの名無しさん:2007/02/22(木) 16:19:21
fgets(buff, sizeof(buff), stdin);
sscanf(buff, "%s", buff);

これは反則技ですか?

181 :デフォルトの名無しさん:2007/02/22(木) 16:24:40
fgets(buff, sizeof(buff), stdin);

むしろ一般的(?)。これだけで十分だな。最後に\nがくっ付くので注意

182 :デフォルトの名無しさん:2007/02/22(木) 16:29:03
ごめん、説明が足らんかった。
sscanf(buff, "%s", buff); の方。
同じものにsscanfをしていいのかどうか

183 :デフォルトの名無しさん:2007/02/22(木) 16:38:44
>>182
領域が重なっていると鼻から悪魔

184 :デフォルトの名無しさん:2007/02/22(木) 16:49:57
ホワイトスペースで区切りたいってことか?やる意味がよく分からん

185 :デフォルトの名無しさん:2007/02/22(木) 16:54:47
>>180
反則技
あぶないコーディング

186 :デフォルトの名無しさん:2007/02/22(木) 16:55:38
改行\nを除きたいだけです
別に buff[strlen(buff)-1] = '\0'; 等でも
やりたい事はできるのだけど、
sscanf使ったらどうなるのかな、って思っただけ。

187 :デフォルトの名無しさん:2007/02/22(木) 16:56:55
>>182
実用上問題ないけど、かなり危険な気がする
でも、その例が思い浮かばない
ループで\nを取り除いたほうがいい気がする

>>184
\nを取り除きたいんじゃないの?

188 :デフォルトの名無しさん:2007/02/22(木) 16:59:22
strcpyなんかと同じで、コピー元オブジェクトとコピー先オブジェクトのメモリ領域が重複していている場合の動作は未定義

189 :デフォルトの名無しさん:2007/02/22(木) 17:38:36
>>186
それやるなら

fgets(buff, sizeof(buff), stdin);
sscanf(buff, "%s", command);

でいいんじゃない?
buffは入力データを格納する領域の名称
入力データを加工したらもうbuffではないでしょう

190 :デフォルトの名無しさん:2007/02/22(木) 17:58:26
C言語でマルチスレッドを使う方法と
httpsの使い方を教えてください

191 :デフォルトの名無しさん:2007/02/22(木) 18:19:34
>>190
目的の環境に合わせて適切なライブラリを入手せよ。
C言語自体には、それらの取り扱いは規定されていない。

192 :デフォルトの名無しさん:2007/02/22(木) 22:33:45
JavaのSystem.CurrentTimeMillies()と同等の関数名を教えてください。

193 :デフォルトの名無しさん:2007/02/22(木) 22:38:56
標準Cでは秒未満の時刻情報を扱う手段はないが、

#include <time.h>
time_t time(time_t *timer);

194 :デフォルトの名無しさん:2007/02/23(金) 00:35:51
char *p  = "ABC";



char [10]  = "ABC";
char *p;
p = s;

の違いは何なのでしょうか?

195 :デフォルトの名無しさん:2007/02/23(金) 00:41:17
>>194
前者はコンパイルができて後者はエラーになってコンパイルが通らない。

196 :194:2007/02/23(金) 00:42:34
>>195
どうしてなんでしょうか?
同じポインタですよね?

197 :デフォルトの名無しさん:2007/02/23(金) 00:44:43
>char [10] = "ABC";

↑変数名がないからエラーになる。ポインタは関係ない。

198 :デフォルトの名無しさん:2007/02/23(金) 00:46:45
そこは s[10] くらいエスパーしたれよw

199 :194:2007/02/23(金) 00:47:28
訂正

char *p  = "ABC";



char s[10]  = "ABC";
char *p;
p = s;

の違いでした。

200 :デフォルトの名無しさん:2007/02/23(金) 00:47:29
ワロス

201 :デフォルトの名無しさん:2007/02/23(金) 00:50:03
>>194
pの指しているものが文字列リテラルか文字配列かの違い。

202 :194:2007/02/23(金) 00:54:10
>>201
もう少し簡単にお願い致します
”リテラル”、入門書にも載っていません(索引も調べましたが)・・・・
文字列リテラルか文字配列とは・・・?

203 :デフォルトの名無しさん:2007/02/23(金) 00:56:41
文字列リテラル…変更できないNUL終端文字列

204 :デフォルトの名無しさん:2007/02/23(金) 00:57:21
>>194
char *p  = "ABC"; ←"ABC"という文字列を指しています。普通はこのポインタを介しての変更はしません。

char s[10]  = "ABC";
char *p;
p = s; ←今は"ABC"の入った配列の先頭を指しています。指してる配列の中身を変更できます


205 :デフォルトの名無しさん:2007/02/23(金) 00:58:58
入門書も不親切なのが多い。
記憶クラスやらスコープやらの説明をする前に、変数を宣言すると
メモリ上に型に応じた領域が確保されるというのをちゃんと教えて
くれないといかん。
あと、初期値の設定なんて0/NULLにしておくくらいしか普通使わなく
ないか?

206 :194:2007/02/23(金) 01:07:15
>>203
>>204
>>205
ありがとうございます

char s[10]  = "ABC";
char *p;
p = s;
は、a[0] A を指していて

char *p  = "ABC";  pの中に"ABC"が入るって事でしょうか?




207 :デフォルトの名無しさん:2007/02/23(金) 01:12:00
pはポインタだから、格納できるのはアドレスだけ
あくまで"ABC"っていう文字列リテラルの先頭を指しているだけで、
中に入っているわけじゃない。

こういうのって実行時にプログラムが、どんな風に展開されてるかを
イメージできないと理解しにくいんでない?

208 :デフォルトの名無しさん:2007/02/23(金) 01:15:05
char *p = "ABC"; だと、
ヒープにおかれた "ABC" の先頭アドレスが p に代入される。

char s[10] = "ABC"; だと、
スタックに s がつまれ、"ABC" で初期化される。

209 :デフォルトの名無しさん:2007/02/23(金) 01:15:28
>>206
(こいつだめだ・・・まるでわかってない・・・俺が教えてやんよ!)
前者はそんな感じ(中身のAを指してるわけじゃないが)
後者は例えば文字列リテラルという型LITERALがあったとしよう。
char *p  = "ABC";っていうのはいわば前者と同じ感じで

LITERAL lite = "ABC"
char *p = &lite; //&liteはアドレス

こんな感じで、配列だろうと文字列リテラルだろうとメモリ上にあるからアドレスがあるわけだ

210 :194:2007/02/23(金) 01:16:53
>>207
難しいです、というかイメージが付きにくいです
>>文字列リテラルの先頭を
は"ABC"の{'A',B',C,','\0'};リテラルの先頭とは
\0←を指しているのでしょうか?それとも'A'でしょうか?

211 :デフォルトの名無しさん:2007/02/23(金) 01:18:57
Aに決まってるだろ・・・

212 :デフォルトの名無しさん:2007/02/23(金) 01:18:59
ポインタはただの矢印だって。

矢印に 'A' が入るんじゃない。
矢印のさしている先に 'A' があるんだよ。

213 :デフォルトの名無しさん:2007/02/23(金) 01:19:21
アラビアか

214 :デフォルトの名無しさん:2007/02/23(金) 01:19:59
ヘブライだよ

215 :デフォルトの名無しさん:2007/02/23(金) 01:28:19
fabs()とabs()は動きが違うのか?

216 :デフォルトの名無しさん:2007/02/23(金) 01:30:56
>>208
堂々とした間違い。

217 :デフォルトの名無しさん:2007/02/23(金) 01:31:54
>>215
int か double か

218 :194:2007/02/23(金) 01:32:10
皆さん、ありがとうございました・・・
ヒープやスタック、とか説明が高度で付いていけません
双方共に同じ先頭を指してるのに何が違うのかイメージがつかないです


もう一度だけ>>char s[10] = "ABC"; だと、
スタックに s がつまれ、"ABC" で初期化される。
の>>スタックに s がつまれ、"ABC" で初期化される。
というのを解説お願い致します。

あとは出直してきます



219 :デフォルトの名無しさん:2007/02/23(金) 01:33:27
>>215
int abs(int);
double fabs(double);

220 :デフォルトの名無しさん:2007/02/23(金) 01:34:02
>>218
そこ間違ってるから気にする必要はない

221 :194:2007/02/23(金) 01:34:36
皆さん、ありがとうございました・・・
ヒープやスタック、とか説明が高度で付いていけません
双方共に同じ先頭を指してるのに何が違うのかイメージがつかないです


もう一度だけ>>char s[10] = "ABC"; だと、
スタックに s がつまれ、"ABC" で初期化される。
の>>スタックに s がつまれ、"ABC" で初期化される。
というのを解説お願い致します。

あとは出直してきます



222 :194:2007/02/23(金) 01:35:18
>>220
ありがとうございました、出直してきます

223 :デフォルトの名無しさん:2007/02/23(金) 01:38:01
>>218
分解して考えると分かるかも
char s[10] = "ABC";は
char s[10];
strcpy(s, "ABC");
この場合は、char s[10]の領域の内容を s[0]='A' s[1] = 'B' s[2]='C' s[3]='\0' s[4]〜以下不定
で初期化。
char *p  = "ABC";
これを分解すると
char *p;
p = "ABC";
こうすれば、pは単なるポインタだってわかるはず。"ABC"はコンパイル時に
プログラム(exeファイルとか)内のどこかにおかれる文字列定数の先頭
のアドレスの意味になる。

224 :36:2007/02/23(金) 02:12:00
質問なのですが、num -- 登録前のリストの要素数 とは
どのことでしょうか?要素とは何でしょうか?

225 :デフォルトの名無しさん:2007/02/23(金) 02:29:08
>>224
"米飯", 150.3   ←要素
"中華麺", 57.1  ←要素
"蕎麦", 133.3   ←要素
"うどん", 100.0  ←要素
"素麺", 133.3   ←要素
"食パン", 250.3  ←要素
                要素数=6

226 :36:2007/02/23(金) 02:45:37
>>225
さんkすです!
要素だから[]だと思っていました

227 :デフォルトの名無しさん:2007/02/23(金) 04:10:56
構造体はポインタは使えますか?
それとも構造体配列でないとポインタは使えないでしょうか?

228 :デフォルトの名無しさん:2007/02/23(金) 04:22:18
構造体を指すポインタ? 使えるよ。


229 :36:2007/02/23(金) 04:35:43
この構造体のポインタは
CALORIE cal[500] = {
{"米飯", 150.3}, {"中華麺", 57.1}, ←アドレス:1000: cal[0]
{"蕎麦", 133.3}, {"うどん", 100.0}, ←アドレス:1001: cal[1]
{"素麺", 133.3}, {"食パン", 250.3} ←アドレス:1002: cal[3]
};
なのでしょうか?

或いは、これら全体でアドレス:1000: cal[0]なのでしょうか?
{"米飯", 150.3}, {"中華麺", 57.1},
{"蕎麦", 133.3}, {"うどん", 100.0},
{"素麺", 133.3}, {"食パン", 250.3}
}


230 :36:2007/02/23(金) 04:45:12
訂正です

{"米飯", 150.3}, ←アドレス:1000: cal[0]
{"蕎麦", 133.3}, ←アドレス:1001: cal[1]
{"素麺", 133.3}, ←アドレス:1002: cal[3]
{"中華麺", 57.1}, ←アドレス:1003: cal[4]
{"うどん", 100.0}, ←アドレス:1004: cal[5]
{"食パン", 250.3} ←アドレス:1005: cal[6]




231 :デフォルトの名無しさん:2007/02/23(金) 04:51:10
構造体の配列でも普通の変数の配列と違いはないよ。

232 :デフォルトの名無しさん:2007/02/23(金) 04:54:46
構造体CALORIE型の配列名calは、そのままCALORIE*という型の
ポインタに代入することが出来る。

指しているのはcalの先頭要素。
ポインタに加減算をすることで次/前の要素をポイントできる。


233 :36:2007/02/23(金) 05:06:02
では、ポインタはアドレス:1000を指してると解釈して良いですね?

234 :デフォルトの名無しさん:2007/02/23(金) 05:09:16
構造体がどうこうより、ポインタの理解が怪しい気がするが。

235 :デフォルトの名無しさん:2007/02/23(金) 05:10:52
ポインタを学ぶときは、アドレスという物理的な概念は忘れた方がいい。


236 :36:2007/02/23(金) 05:22:03
>>234
では違っているのでしょうか?

>>235
え?そうなんですか?
ポインタはアドレスが重要と思っていましたが
では、アドレスでなくインデックス番号を重視すべきですかね?

237 :デフォルトの名無しさん:2007/02/23(金) 05:37:31
ポインタはデータがある場所を指しているのは確かだが、それを
実現するためにCではアドレスという機械寄りの概念を露出させ
てしまっているだけ。Pascalではもっと抽象化されているし、ポ
インタ=アドレスという理解だとJavaにはポインタがないという勘
違いも生む。

場所さえ指せればよいのだから、使い手にとっては、それがメモリ
上のアドレス値であるというのは余計な情報。


238 :36:2007/02/23(金) 05:41:47
( ̄□ ̄;)!!
初めてのプログミングがCだったのが間違いでしたかね
Javaの方が簡単と聞きますし

239 :デフォルトの名無しさん:2007/02/23(金) 05:43:37
×「ポインタ=アドレス」じゃなくて
○「Cではポインタをデータのあるメモリ上のアドレスとして表現している」
と理解してればいいんじゃね?


240 :デフォルトの名無しさん:2007/02/23(金) 05:49:55
>233のポインタってどのポインタよ?

241 :デフォルトの名無しさん:2007/02/23(金) 06:11:30
アドレスの話をしたいんなら、こういうのやってから家
CALORIE *hoge=cal; int i; for(i=0;i<cal_num;i++){printf("%6s(%3.0f) %p\n",hoge->name,hoge->value,hoge);hoge++;}
(int mode = 0; の直後)

で、表示されたモノは一旦忘れてw
真面目な話、例として↑のコードで
CALORIE *hoge(CALORIE型のポインタ)はメモリのどこかに格納されているデータ、CALORIE型の変数(配列)にアクセスできる。
この場合、最初に設定されているアクセス先は配列cal[500]の先頭(つまり要素cal[0])で、
hoge++ で、次々とcal[1], cal[2], cal[3] ... とアクセスして表示している。
冗談で %p で番地を表示しているけど、実際のコーディングでこのアドレスを意識する必要性は無い(と思う

と偉そうに言う俺もほぼ初級者。。。

242 :デフォルトの名無しさん:2007/02/23(金) 07:16:17
int main()
{
char a[4] = "ABC";
char *p = "ABC";
printf("&a = %p\n", &a);
printf("a = %p\n", a );
printf("&a[0] = %p\n", &a[0]);
printf("\n");
printf("&p = %p\n", &p);
printf("p = %p\n", p);
printf("&p[0] = %p\n", &p[0]);
return(0);
}

// 3つとも配列aの先頭アドレス
&a = 0x22cce4
a = 0x22cce4
&a[0] = 0x22cce4

&p = 0x22cce0    // ポインタ変数pのアドレス
p = 0x402000    // ポインタ変数pの値
&p[0] = 0x402000  // "ABC"が格納されている場所の先頭アドレス=ポインタ変数pの値


243 :デフォルトの名無しさん:2007/02/23(金) 07:25:55
>242
そう書くと&a、a、&a[0]どれも同じに見えてしまう。

244 :デフォルトの名無しさん:2007/02/23(金) 09:34:35
>>242
リテラル使って初期化したら初心者には余計わかりづらいと思うんだが。

245 :デフォルトの名無しさん:2007/02/23(金) 12:33:20
>>243
&a、a、&a[0]は、どれも同じ。

a も p も表示させるとアドレスだが、a は配列aの先頭アドレスであって、
&a の示すアドレスに0x22cce4というアドレスが格納されているのではない。
そのため、a = p という代入はできない。

一方で、p は変数pのアドレスではない。
&p の示すアドレスに0x402000というアドレスが格納されている。
この0x402000は "ABC" というデータが格納されている領域の先頭アドレスに
なっている。
変数p にはアドレスを格納できるので、p = a という代入はできる。


246 :デフォルトの名無しさん:2007/02/23(金) 12:37:12
>>245
間違ってるぞ

247 :デフォルトの名無しさん:2007/02/23(金) 12:57:00
どこが間違ってるか書かないと
間違ってるとは言えない

248 :デフォルトの名無しさん:2007/02/23(金) 13:02:59
アドレスとしては一緒だが&aは配列のアドレス、aと&a[0]は配列の先頭要素のアドレスであって
型が違う。
p = &a と代入すると警告が出るはず。

249 :デフォルトの名無しさん:2007/02/23(金) 14:26:12
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX_LINE 79

void main(void)
{
char s[] = "0123456789"
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"[]@;:-+*^~|_,.\\/\"\'%%$#&()!";
char ps[MAX_LINE];
int si = sizeof(s);
int i;

srand(time(NULL));

for( i = 0; i < MAX_LINE; i++ )
ps[i] = s[rand() % si];
printf(ps);
}

なんとなく思いつきでランダムな文字列を79個配列にコピーして
それを表示するプログラム作ってみたんですが、実行する毎に79文字表示されなかったり
エラーが出たりします。
間違いを教えて頂けないでしょうか?

250 :デフォルトの名無しさん:2007/02/23(金) 14:37:27
エラーメッセージ書けよ。
79文字表示されないのはs[si-1]が'\0'だから。

251 :デフォルトの名無しさん:2007/02/23(金) 14:40:13
>>250のもそうだが、安定しないのは文字列に % が入ってるから。

printf("%s", ps);
でやってみ

252 :デフォルトの名無しさん:2007/02/23(金) 14:41:17
sizeof(s) は ¥0 までのサイズになるので、
rand() % si のとりうる範囲は[0,sの文字列長+1]
よって ps[i] の途中に ¥0 が入る可能性がある。


253 :デフォルトの名無しさん:2007/02/23(金) 14:42:52
微妙に訂正。
「¥0 までの」ってのは「¥0 を含んだ」ね。
素直にstrlen使おう。



254 :デフォルトの名無しさん:2007/02/23(金) 14:43:44
短くなるのは\0混じりだからだな

255 :デフォルトの名無しさん:2007/02/23(金) 14:47:53
>>250-254
ご丁寧にありがとうございます。
エラーは例の「ご迷惑をおかけして(ry」のヤツです。

NUL文字について忘れてました。

256 :デフォルトの名無しさん:2007/02/23(金) 15:08:53
質問です
unsigned long a ;

if( a>>31 & 1 == 1 )やif( a>>31 & 1 !=0 )

とすれば、aの31ビット目が1であるかどうか判定できますでしょうか?

257 :デフォルトの名無しさん:2007/02/23(金) 15:35:09
31ビット右にシフトして、1と論理積とったらわかるんじゃないかな

258 :デフォルトの名無しさん:2007/02/23(金) 15:35:20
>>256
何でそんな質問に到ったのかわからんので想像で答えるが
演算子の優先順位に注意

259 :デフォルトの名無しさん:2007/02/23(金) 16:24:17
&1で1ビットだけとったら値はbooleanになるんだから
==1はいらないんじゃないすか、と主観で語ってみる。

260 :デフォルトの名無しさん:2007/02/23(金) 21:55:40
boolつうか非ゼロな

261 :36:2007/02/24(土) 00:25:43
度々で申し訳ありませんが、最後の質問です

/************************************
calregist() カロリーリストへ登録する
[引数] pcal -- カロリーリストへのポインタ
num -- 登録前のリストの要素数
[戻り値] 登録後のリストへの要素数
*************************************/

これの
>>calregist() カロリーリストへ登録する
カロリーリストとは
{"米飯", 150.3}, {"中華麺", 57.1},
{"蕎麦", 133.3}, {"うどん", 100.0},
{"素麺", 133.3}, {"食パン", 250.3}
これであっていますよね?

262 :デフォルトの名無しさん:2007/02/24(土) 00:26:17
Aが1、または2または3の場合、正常それ以外は異常という判定で
以下のようにコーディングしたら先輩からそんな糞コードかくなと怒られてしまった。
実際はもっと条件が複雑で、逆の条件を考えるのが億劫だったからこうしたんだけど
やっぱりダメですか?

if (a == 1 || a == 2 || a ==3)
{
/* 何もしない */
} else {
/* エラー */
return 1
}

正常の場合、処理が続く


263 :デフォルトの名無しさん:2007/02/24(土) 00:32:05
>逆の条件を考えるのが億劫だったから
全体を !() でくくればいいだけじゃね

264 :デフォルトの名無しさん:2007/02/24(土) 00:34:40
>>261
カロリーリストはこの場合はCALORIE cal[500]だと思われ。{"米飯", 150.3},(ryもその一部
日本語に惑わされずに順に追ってけば分かると思うが

>>262
if (A != 1 || A != 2 || A !=3)
{   /* エラー */
  return 1;
}

265 :デフォルトの名無しさん:2007/02/24(土) 00:36:35
ミスった。Aが1でも2でも3でもない場合
if (A != 1 && A != 2 && A !=3)
{   /* エラー */
  return 1;
}

266 :デフォルトの名無しさん:2007/02/24(土) 00:38:55
>>265
誰もそんなこと聞いてないと思うが

267 :デフォルトの名無しさん:2007/02/24(土) 00:53:21
#define unless(cond) if(!(cond))

268 :デフォルトの名無しさん:2007/02/24(土) 01:07:35
Aが整数なら
if(A<1 || 3<A)
でいいんじゃないか

269 :デフォルトの名無しさん:2007/02/24(土) 01:08:54
だからそういう問題じゃないだろうと…

270 :デフォルトの名無しさん:2007/02/24(土) 01:14:03
>>269
じゃあ書いたら
思い浮かばない?

271 :デフォルトの名無しさん:2007/02/24(土) 01:20:09
>262
先輩の言うことは聞いとけ。
っていうかその程度の条件が億劫ってやヤバすぎだろ。

272 :262:2007/02/24(土) 01:21:31
!()は自分もすぐに思いついたのですけど
一応、独自のコーディングルール!?に引っかかって使えないのですよね。
なんとか正しい条件は書けて、テストも上手くいったけど
何度条件判定見直しても、わけわかんねって感じです。
既存のコードの修正なんで、ロジックも変にいじれないしつらい・・・


273 :デフォルトの名無しさん:2007/02/24(土) 01:30:43
>>271
( (a < 4 || a > 5 && a % 6) && g(a) )
の否定は?って聞かれて正しい答えが2,3秒で思い浮かぶならいいけどさ。

そうじゃなければ、エンバグのもとになるんじゃないかな。

274 :デフォルトの名無しさん:2007/02/24(土) 05:29:55
>265見たいな糞コード書かれるよりは>262の方がよっぽどマシだな。
コメントはアレだけど。

275 :デフォルトの名無しさん:2007/02/24(土) 05:37:56
>>274
後学のために>>265のどの辺がどう糞コードなのか教えて欲しい。
おれにはそうは見えないのだが。

276 :デフォルトの名無しさん:2007/02/24(土) 05:41:21
if (a == 1){
//処理1
}
else if (a == 2) {
//処理2, 3略
}
else {
//鰓
return 1
}

良く分からんけど、こういう処理をするんじゃないの?
(switch使っても一緒?

277 :デフォルトの名無しさん:2007/02/24(土) 05:46:58
!()使えないってのも腐った規約だな。


278 :デフォルトの名無しさん:2007/02/24(土) 05:57:52
漏れは>>262みたいなよりは>>265みたいに書いてくれた方がいいな

279 :デフォルトの名無しさん:2007/02/24(土) 06:06:59
>Aが1、または2または3の場合、正常それ以外は異常という判定
これは誰がどう見ても、
if (A == 1 || A == 2 || A == 3) 正常;
だよな。でだ。
if (A != 1 && A != 2 && A != 3) 異常;
と書いてあったらそれが
>Aが1、または2または3の場合、正常それ以外は異常という判定
だと瞬時に判断できるか?
条件の部分がもっと複雑だったらどうする? 一々ドモルガンの定理でひっくり返すのか?

>Aが1、または2または3の場合、正常それ以外は異常という判定
だけしか書いてなくて、Aが整数かどうか判らないのだから>268でいいかどうかも判らないしな。

280 :デフォルトの名無しさん:2007/02/24(土) 08:15:58
char str[256] = "123";
int num;

num=(int)str;

コンパイルは通るのですがうまくキャストされてません。
※if(num==123)がfalseになる
strは毎回あたいが変わるものとしてどうしたらいいでしょうか?

281 :デフォルトの名無しさん:2007/02/24(土) 08:53:34
>>279
整数でないならますます>>268みたいに判別すべきじゃないのか?

282 :デフォルトの名無しさん:2007/02/24(土) 09:26:29
>>281
値のリストが膨大でも?

>>280
キャストでは無理。atoi()か、できればstrtol()を使え。

283 :282:2007/02/24(土) 09:27:35
>>281
あー、元レスを中途半端に誤認した。無視してくれ。

284 :デフォルトの名無しさん:2007/02/24(土) 09:58:20
テキストファイルを最初100行分メモリ領域確保して、その後10行毎に
メモリ領域確保しながら読み込む事を考えています。
(1)と(2)とではどちらが一般的なルーチンなのでしょうか?
(今(1)なのですが、野暮ったい感じがします・・)

(1)
100行分領域確保
ループ{
 10行毎に領域確保
 ファイル1行読込
}

(2)
ループ{
 もしループ初回なら100行分領域確保
 10行毎に領域確保
 ファイル1行読込
}

285 :デフォルトの名無しさん:2007/02/24(土) 10:16:36
>>280
#include <stdio.h>
#include <math.h>
int main(void)
{
char str[256] = "123";
int num, len, tmp, i;
tmp = *(int *)str; len = strlen(str); num = 0;
for (i=0; i<len; i++)
num += ((tmp >> i*8) & 0xFF - '0') * (int)pow(10, (double)(len-1-i));
printf("%d\n", num);
return(0);
}


286 :デフォルトの名無しさん:2007/02/24(土) 10:19:12
>>280
charの配列を宣言したとき、その変数はポインタになる。
num=(int)str;
↑つまりこれはnumに文字列"123"へのアドレスをint型として代入しただけ。
そもそもCでは代入演算子を使って文字列を一気に変数ぶち込む、というのが出来ない。
>>282の言うとおりatoiあたりを使うしかない。自分で関数作ってもいいけど。

>>284
その辺は個人のコーディングスタイルの問題じゃなかろうか。
個人的には1の方が見やすい。

287 :デフォルトの名無しさん:2007/02/24(土) 11:21:14
>>284
野暮ったく思う理由は?
別に(1)でいいと思うけど。
#領域確保が関数化されていなくて複雑な手順だというのなら、(2)の方がましだが……

>>285
勘弁してくれ。

288 :デフォルトの名無しさん:2007/02/24(土) 11:38:50
>>286
>>287
野暮ったいというのは、(2)のループ内の領域確保部分を関数化
した方が見やすいかと思ったからです
でも面倒になってきたんで(1)で行きます
ありがとうございました

289 :デフォルトの名無しさん:2007/02/24(土) 11:51:13
>>288
関数化したなら、その関数を(1)の形で呼ぶだけでいいじゃん。

290 :デフォルトの名無しさん:2007/02/24(土) 11:55:00
>284
ループの先頭で初回にしか分岐しない条件入れるのって気持ち悪くない?

291 :デフォルトの名無しさん:2007/02/24(土) 11:55:10
>>288
bufsize=256文字分領域確保
ループ{
 ファイル1字読込
 bufsize文字になったらbufsize+256文字分に領域拡大
push(...);
}

push(...)
{
 もし1行目ならdatasize=100行分領域確保
 datasize行になったらdatasize+10行分に領域拡大
 1行追加
}


292 :デフォルトの名無しさん:2007/02/24(土) 12:14:12
質問です。

ゼロ除算を避ける方法ですが、分母 a が int 型の整数なら、
a==0 のときだけ場合分けすれば問題なしです。

分母 a が double 型のときはどうなのでしょうか?
a==0.0 のときだけ場合分けすればよろしいのでしょうか?
同じ 0 でも、0.0+1e とか 0.0+10e とかありそうで不安です。

293 :デフォルトの名無しさん:2007/02/24(土) 12:16:21
fabs(a)<1e-10

294 :デフォルトの名無しさん:2007/02/24(土) 12:25:28
DBL_EPSILON使えよ。

295 :デフォルトの名無しさん:2007/02/24(土) 12:37:57
>>294
gcc(mingw) の include ディレクトリの中を grep で捜したけど無いぞ
どのファイルに書かれているのかkwsk

296 :デフォルトの名無しさん:2007/02/24(土) 12:43:21
<float.h>

297 :デフォルトの名無しさん:2007/02/24(土) 12:47:46
doubleで0除算しても整数除算と違ってエラー終了しないことが多いがね。

298 :デフォルトの名無しさん:2007/02/24(土) 12:53:40
>>295
俺の環境では include/c++/3.4.2/limits にあったが

299 :デフォルトの名無しさん:2007/02/24(土) 12:57:58
>>298
スレタイ嫁

300 :295:2007/02/24(土) 13:05:36
>>298
そこにもなかった
return __DBL_EPSILON__;
と書いてある行はあったが定義の場所が不明

Borland C++ Compiler ver5.5 なら float.h に DBL_EPSILON の定義が書いてあった

301 :デフォルトの名無しさん:2007/02/24(土) 13:17:54
>>300
中のぞいてみれば分るが、君がmingwのincludeディレクトリだと信じている
ディレクトリの中のfloat.hは#include_nextで別のところのfloat.hを読んでるはずだ。

302 :デフォルトの名無しさん:2007/02/24(土) 13:24:38
>>301 thx
include\..\lib\gcc\mingw32\3.4.2\include\float.h
にあったよ

303 :280:2007/02/24(土) 15:04:34
>>282>>285>>286
勉強になりました、ありがとうございます

304 :デフォルトの名無しさん:2007/02/24(土) 16:27:48
>>292
==0.0の時でいいんじゃね?それは実際の表記であって値は同じじゃね?

305 :デフォルトの名無しさん:2007/02/24(土) 16:40:42
機械イプシロンについて高校生でも理解できる解説きぼんぬ。


306 :デフォルトの名無しさん:2007/02/24(土) 16:46:00
>>292
浮動小数点の0除算は正負のInfかNaNが返るだけだから、そんなことする必要なくね?

307 :デフォルトの名無しさん:2007/02/24(土) 16:48:16
>>305
どこが判らんの?

308 :デフォルトの名無しさん:2007/02/24(土) 16:54:56
>>305
人間イプシロンの機械版だよ

309 :268:2007/02/24(土) 17:55:04
>>281
有効なのは1、2、3 だから
2.5とかはダメかもしんないので

310 :268:2007/02/24(土) 17:59:16
>>279
>Aが1、または2または3の場合、正常それ以外は異常という判定
>だけしか書いてなくて、Aが整数かどうか判らないのだから>268でいいかどうかも判らないしな。
だから「整数なら」って書いたんだけど


311 :デフォルトの名無しさん:2007/02/24(土) 18:03:26
そんなピントのずれた話題をずるずる引っ張るなよ…

312 :デフォルトの名無しさん:2007/02/24(土) 19:54:53
文字列strの中に、文字cが含まれていれば(複数ある場合は、最も先頭側とする)、
その添字を返し、含まれていなければ-1を返す関数
int str_char(const char str[], int c) {}
を作成せよ。

のint cってchar cではないんでしょうか?

313 :デフォルトの名無しさん:2007/02/24(土) 20:24:09
>>312
標準関数では、古いCとの互換性などの観点から引き数にintより小さい型は使わない。
それに倣ったか深く考えてないか、その辺だろ。

314 :デフォルトの名無しさん:2007/02/24(土) 20:36:16
>>313
どもです。
う〜ん仕様変えるのはアレなのでこのまま頑張りますか…

315 :デフォルトの名無しさん:2007/02/24(土) 20:44:33
char cでは無い
unsigned char か int

316 :デフォルトの名無しさん:2007/02/24(土) 20:53:07
>>315
ありがとうございます。それでやってみます〜

317 :デフォルトの名無しさん:2007/02/25(日) 01:43:38
コマンドプロントから実行っていうのは飽きてきたんで、C言語でWindowsの
ウィンドウを作りたいんですが、なにを勉強すればいいんでしょうか?
オススメの書籍、サイトありましたら教えてください

318 :デフォルトの名無しさん:2007/02/25(日) 02:03:51
wisdomsoft (旧

319 :デフォルトの名無しさん:2007/02/25(日) 02:35:08
>>317
いわゆるpetzold本しかないんじゃね?
「プログラミングWindows」という本だ。
amazonとかで探してみれ。

ただし、期待しているものとは違っている可能性がある。

320 :デフォルトの名無しさん:2007/02/25(日) 02:39:07
C++ じゃない純粋な C だけの Windows プログラムの本って
そういや見たことないや

321 :デフォルトの名無しさん:2007/02/25(日) 02:41:04
http://www9.plala.or.jp/sgwr-t/c/sec15-4.html
このページの、【2.アドレス渡し】の下図で
seito2[0] 1000番
seito2[1] 1001番
seito2[2] 1002番
なのでしょうか?

322 :デフォルトの名無しさん:2007/02/25(日) 02:57:27
違う。

seito2[1] は
seito2[0] のアドレス + sizeof(seiseki) (場合によってはさらに詰め物)
のとこにある。


323 :デフォルトの名無しさん:2007/02/25(日) 02:59:51
ただし、ポインタの加減算は指しているデータの型でスケールす
る(拡大される)ので、

seiseki* p = &seito2[0];
なときに
p + 1 == &seito2[1];
となる。つまりは、
*(p + 1) == seito2[1];

というか配列という記法は上のような式の左辺を見やすくするための
便法でしかない。


324 :デフォルトの名無しさん:2007/02/25(日) 03:04:28
>>322->>323
http://www9.plala.or.jp/sgwr-t/c/sec10-2.html
では、配列とポインタと同じ事でしょうか?

となると
seito2[0] 1000番
seito2[1]
seito2[2]

seito2[1]
seito2[2]
のアドレスは幾つになるのでしょうか?

325 :デフォルトの名無しさん:2007/02/25(日) 03:09:10
いくつ増えるかは
- CPUが何か
- sizeof(seiseki) がいくつになるか
(単純に構造体のメンバーのサイズの合計とはならない可能性がある)
によって違う。




326 :デフォルトの名無しさん:2007/02/25(日) 03:15:57
size = sizeof(seito2) とすると
seito2[0] 1000番
seito2[1] 1000+size番
seito2[2] 1000+size*2番

327 :デフォルトの名無しさん:2007/02/25(日) 03:26:39
あるテストをしました。
テストを受けた人間の情報を管理する為に、個別に個人情報紙(構造体)を作りました。
個人情報紙(構造体)には"テストの成績番号""名前""点数"を書く事にしました。
今回のテストの情報用紙を束ねた物には、seito2という名前を付け管理する事にします。

では、seito2を束ねた順に横に並べてみましょう。
この並べ始めた地点をseito2[0]と呼ぶ事にします。
次は当然seito2[1] その次はseito2[2] になります。

用紙のサイズは全部同じにしてあるので
用紙のサイズ * 見たい生徒の番号(何番目に並べたか) で見付ける事も出来ます。


なんかめんどくなった。
見てわからんなら実際にメモ用紙にでも書いて並べてみれ

328 :デフォルトの名無しさん:2007/02/25(日) 03:26:40
>>325->>326
では、CPUなどによって違うのですね
ありがとうございました。



329 :デフォルトの名無しさん:2007/02/25(日) 04:34:32
>321
そこのサイト学生番号とアドレスの数字が近すぎてよくないな。
本来無関係なのに数字同士が近いと初心者が勝手に関連づけることはよくあるから。

330 :デフォルトの名無しさん:2007/02/25(日) 04:42:09
教えてください。

Linuxで以下の条件コンパイルができました。
(gcc -DDEBUG1 ファイル名 などでコンパイルが通る)

#if (DEBUG1 || DEBUG2)
・・・
#endif

これは

#if defined(DEBUG1) || defined(DEBUG2)
・・・
#endif

と等価ということでしょうか?

331 :デフォルトの名無しさん:2007/02/25(日) 05:10:18
>>330
-DDEBUG1でやってみたら?

#include        <stdio.h>

int main()
{
#if (DEBUG1 || DEBUG2)
        printf("hello %d\n", DEBUG1);
#endif
        return 0;
}

332 :デフォルトの名無しさん:2007/02/25(日) 05:10:27
C言語でGUIを作るにはWin32APIを勉強すればいいんでしょうか?

333 :デフォルトの名無しさん:2007/02/25(日) 05:23:08
>330
違う。
#define DEBUG1 0
#define DEBUG2 0
で両者の動作を比較してみな。

334 :デフォルトの名無しさん:2007/02/25(日) 05:33:33
>>332
という質問するからにはWindows限定で良いんだろうから
(1) 窓の生成からメッセージレベルまで全部操作したい → Win32API
(2) C++&既製ライブラリでWin専用アプリをバリバリ作り倒したい → MFC(Visual C++ 6 or .NET使用)
(3) 今後の.NETの展開に期待しつつ、簡単にGUI開発したい → C# (Visual C#)

Visual Studio .NET(有料)なら全部可
BCC5.5forWin なら、(1)のみ可

http://pc10.2ch.net/test/read.cgi/tech/1171721448/
http://pc10.2ch.net/test/read.cgi/tech/1171389245/
http://pc10.2ch.net/test/read.cgi/tech/1152778344/
俺の独断だし勘違いあるかもしれんけど
環境依存ネタはスレ違いなので、以下は該当スレで……

335 :デフォルトの名無しさん:2007/02/25(日) 05:57:58
>>334
ありがとうございます
APIを勉強してみます

336 :デフォルトの名無しさん:2007/02/25(日) 06:57:46
>>324
結論、そのサイトはあなたの学習にとって、著しく遠回りを強いているということですね。

337 :デフォルトの名無しさん:2007/02/25(日) 07:09:51
>>336
確かに。
無料サイトだけで理解できたならそれで良いかもしれんが、
実際>>324はそこのページとかで悩み続けて徒に時間を浪費してるわけで
ちょっと分厚い参考書読むとか、視点を変えてPCアーキテクチャをちょびっと学ぶとか
色々あるだろうに。

もし、このスレの頭の方からポインタについて質問し続けてる人だったら
ホント他のやり方で学んだほうが良いんじゃないかと

338 :デフォルトの名無しさん:2007/02/25(日) 09:57:23
http://pc10.2ch.net/test/read.cgi/tech/1167140188/
素直に本買えと

339 :デフォルトの名無しさん:2007/02/25(日) 10:29:47
そーいや ATL/WTL とかはどこに行ったの?

340 :デフォルトの名無しさん:2007/02/25(日) 12:45:40
>>305
1 + n == 1 が成り立たない最小の n > 0 だったかと。
機械イプシロンより小さい値を足しても、
精度が足りなくて 1 のまんま。

341 :デフォルトの名無しさん:2007/02/25(日) 13:04:59
0.5 + DBL_EPSILON != 0.5
1.0 + DBL_EPSILON != 1.0
2.0 + DBL_EPSILON == 2.0
2.0 + 2 * DBL_EPSILON != 2.0

n が1より大きい場合は該当の値も機械イプシロンより大きくなると
思っていいのかな。


342 :デフォルトの名無しさん:2007/02/25(日) 14:19:01
>>339
ほら、あんたの後ろに。

343 :デフォルトの名無しさん:2007/02/25(日) 17:21:32
    /\___/ヽ   ヽ
   /    ::::::::::::::::\ つ
  . |  ,,-‐‐   ‐‐-、 .:::| わ
  |  、_(o)_,:  _(o)_, :::|ぁぁ
.   |    ::<      .::|あぁ
   \  /( [三] )ヽ ::/ああ
   /`ー‐--‐‐―´\ぁあ

344 :デフォルトの名無しさん:2007/02/25(日) 19:25:16
>>341
思っていいけど、連続的に変化する訳じゃなくて、
もっと離散的に変化すると思われる。

345 :デフォルトの名無しさん:2007/02/25(日) 22:50:24
ん?

346 :デフォルトの名無しさん:2007/02/25(日) 22:59:01
こんな感じの話だ。二進数ね。

1.0000000000000000000000000000000000000000000000000000e+00000000000
+.0000000000000000000000000000000000000000000000000001e+00000000000
-------------------------------------------------------------------
1.0000000000000000000000000000000000000000000000000001e+00000000000
↑↓同じイプシロン
1.0000010101010101010101010101010111101011010001110110e+00000000000
+.0000000000000000000000000000000000000000000000000001e+00000000000
-------------------------------------------------------------------
1.0000010101010101010101010101010111101011010001110111e+00000000000
↑↓違うイプシロン
1.0000000000000000000000000000000000000000000000000000e+00000000001
+.0000000000000000000000000000000000000000000000000001e+00000000001
-------------------------------------------------------------------
1.0000000000000000000000000000000000000000000000000001e+00000000001

347 :デフォルトの名無しさん:2007/02/25(日) 23:52:22
どうもありがとうございます。
>>331
-DDEBUG1 で、たまたまDEBUG1が0ではなかっただけでした。
てっきりゼロのマクロかと思ってたのでprintがコンパイル対象になってるのが
疑問でした。
>>333
下は定義されていればそれだけで真ということですね。これからは
-DDEBUG1=0 -DDEBUG1=1 とかでコンパイルすることにします。

348 :デフォルトの名無しさん:2007/02/26(月) 00:09:38
>>347
マニュアルに書いてあることなんで、(ry

349 :デフォルトの名無しさん:2007/02/26(月) 01:12:38
#include <stdio.h>

int func1 (void){

return 10;

}

main(){

int d;
d = func1();
printf("%d\n", d);
return 0;

}

どうして、10になるのかわかりません
これは、int d; に10は代入されていないのに・・・・

350 :デフォルトの名無しさん:2007/02/26(月) 01:17:21
d = func1()でdにfunc1()の戻り値を代入してる。
func1()の戻り値は10なのでdに10を代入してることになる。

351 :デフォルトの名無しさん:2007/02/26(月) 01:25:25
これまた初歩的なのが来たな。なんか嬉しいぞww

わかりにくかったら関数を変数と同じように考えるといい。でその値はreturn文で決まると
このような記述が出来ないとそもそも関数の戻り値が利用出来ない。
if文での条件式に関数そのものがif(func(hoge))みたいに使われることも多々ある。

352 :349:2007/02/26(月) 01:29:52
>>350
もう少し簡単にお願い致します。。。

>>351
>>わかりにくかったら関数を変数と同じように考えるといい
>>349のソースを使い例をお願いします。

353 :デフォルトの名無しさん:2007/02/26(月) 01:30:10
2

354 :デフォルトの名無しさん:2007/02/26(月) 01:40:18
データが取り得る最大値の配列を作成しそれに初期値を持たせたいのですが、
データの型がchar型やfloat型やint型が混在している場合は
どのように配列を作成するのが好ましいのでしょうか。
ご教授お願いします。

355 :デフォルトの名無しさん:2007/02/26(月) 01:48:37
>>354
VBを使う

356 :デフォルトの名無しさん:2007/02/26(月) 01:54:37
>>352
関数は終了時に return で値を返す事が出来る。
func1 の return に注目。
そして、d = func1() は func1 が返した値を入れている。
他にも出来る事はあるけど、今はこの使い方を理解しよう。
func1 を手本に新たに func2 を作って d = func2 にしてみれ。

357 :デフォルトの名無しさん:2007/02/26(月) 01:55:49
>>354
すまんが、何を言いたいのか分からん…

358 :デフォルトの名無しさん:2007/02/26(月) 01:58:12
>>357
variant型をよこせと…

359 :デフォルトの名無しさん:2007/02/26(月) 02:09:53
unionでもつかっとけば?

360 :デフォルトの名無しさん:2007/02/26(月) 02:11:20
>>354
メモリが勿体無いがdoubleで配列作ってに格納する時にdoubleにキャストする

>>352
考え方・理解の仕方ってだけで実際に変数になるわけじゃないからな
何歳か知らんが数学やったのなら>>349はy=f(x)と同じ状態だな

361 :デフォルトの名無しさん:2007/02/26(月) 02:12:37
>>359
で、使うときにどのメンバを使っていいのか間違えて NaN

362 :デフォルトの名無しさん:2007/02/26(月) 02:16:27
typedef struct {
 enum {
  t_empty,
  t_double,
  t_int,
  t_char
 } type;
 union {
  double v_double;
  int v_int;
  char v_char;
 } value;
} variant_t;

int main() {
 variant_t data[] = {
  { t_empty},
  { t_double, { .v_double = 2.3 } },
  { t_int, { .v_int = 42 } },
  { t_char, { .v_char = '!' } },
 };
 for(int i = 0; i < sizeof(data)/sizeof(*data); ++i) {
  if((data+i)->type) switch((data+i)->type) {
   case t_double: printf("%d: double(%f)\n", i, (data+i)->value); break;
   case t_int: printf("%d: int(%d)\n", i, (data+i)->value); break;
   case t_char: printf("%d: char(%c)\n", i, (data+i)->value); break;
  }
 }
}

363 :デフォルトの名無しさん:2007/02/26(月) 02:21:48
きっつー。
釣られてやるのも適当にしよーよー

364 :デフォルトの名無しさん:2007/02/26(月) 02:52:11
#define variant(t, v) ((variant_t) { t_ ## t, { .v_ ## t = (v) } })
data[0] = variant(char, 'A');

複合リテラルって今ひとつ使い勝手が分からなかったんだが、
こういうことできるのが便利なんだな。

365 :デフォルトの名無しさん:2007/02/26(月) 16:32:34
CまたはC++で有効なファイルかどうかチェックする関数ってある?
.NETでいうSystem.IO.File.Exists(System.String)に相当する関数

366 :デフォルトの名無しさん:2007/02/26(月) 16:35:28
あるよ

367 :デフォルトの名無しさん:2007/02/26(月) 16:40:03
ここにあるよ

368 :デフォルトの名無しさん:2007/02/26(月) 16:56:41
質問です。こちらのサイトだけでC言語をマスターできますか?

http://www.plustarnet.com/aspil/Programming/

今日から勉強しようと思ってるんですが、もっといいサイトがあったら教えてください。

369 :デフォルトの名無しさん:2007/02/26(月) 17:03:09
先ずは日本語をきちんと読めるようになってからにしましょう

370 :デフォルトの名無しさん:2007/02/26(月) 17:06:15
>>368
そのサイトはやめといたほうがいいんじゃないかな。

371 :368:2007/02/26(月) 17:08:59
>>370
どういう意味ですか?

372 :デフォルトの名無しさん:2007/02/26(月) 17:13:23
ひどい

373 :デフォルトの名無しさん:2007/02/26(月) 17:22:59
質問です。

幾らか容量が分からないものを扱う時の宣言ってどうすれば良いですか?
例えば
typedef struct TESTD{
    int ShainCode;
    int KanriNo;
    int ClientNo;
}TestDef;

みたいなのが有ったとして
これが顧客が無限に増え続ける様に作りたいんですけど・・・

374 :デフォルトの名無しさん:2007/02/26(月) 17:25:17
最初に固定数宣言しておいて、読み込みながら領域再確保する

375 :デフォルトの名無しさん:2007/02/26(月) 17:38:01
>>374
すいません
具体的にコード教えてください

376 :デフォルトの名無しさん:2007/02/26(月) 17:44:49
reallocでググってろ

377 :デフォルトの名無しさん:2007/02/26(月) 18:04:06
reallocは静的配置は無理じゃないですか?

378 :デフォルトの名無しさん:2007/02/26(月) 18:08:03
無限に増え続けるものをどうやって静的配置するのさ

379 :デフォルトの名無しさん:2007/02/26(月) 18:08:38
固定数宣言って静的配置じゃないんですか?

380 :デフォルトの名無しさん:2007/02/26(月) 18:19:29
静的配置なものをどうやって拡張するのかと小一時間問い詰めたい

381 :デフォルトの名無しさん:2007/02/26(月) 18:27:26
TestDef *hoge = NULL;

382 :デフォルトの名無しさん:2007/02/26(月) 18:33:01
でもそれだったら
増やすとき全部の構造体が増えない?
聞いてる人は顧客のところだけ増やしたいんじゃないの?

383 :デフォルトの名無しさん:2007/02/26(月) 18:36:04
無限はあり得ないだろ常識的に考えて

384 :デフォルトの名無しさん:2007/02/26(月) 18:41:32
>>382
無限大には対応できないけど、これでおk?

typedef struct TESTD{
    int ShainCode;
    int KanriNo;
    int *ClientNo;
    int ClientCount;
}TestDef;


385 :デフォルトの名無しさん:2007/02/26(月) 18:45:33
徐々に意味不明になってきたな
日本語って本当に難しい・・w

386 :デフォルトの名無しさん:2007/02/26(月) 20:01:42
>>366
>>367

ファイルポインタがNULLだったらファイルが存在しないってやるしかないのかな?
具体的に関数としてそういう物があるなら教えてください。

387 :デフォルトの名無しさん:2007/02/26(月) 20:07:02
open()だろ。常識的に考えて。

388 :デフォルトの名無しさん:2007/02/26(月) 20:20:56
それはPOSIX関数だろ…

389 :デフォルトの名無しさん:2007/02/26(月) 20:25:18
POSIXでいいならstat

390 :デフォルトの名無しさん:2007/02/26(月) 20:34:31
POSIXならaccess(2)じゃないのか?



391 :デフォルトの名無しさん:2007/02/26(月) 20:38:40
ああ、そうだった。そうだった。
窓の世界に移り住んで久しいから、忘れてしもた

392 :デフォルトの名無しさん:2007/02/26(月) 20:58:25
>>373
可変にしたいやつをポインタで表して、それのためのメモリを malloc() で
確保すれば良い。長さを変える時は realloc() を使う。

ファイルから読んで一つづつ追加する場合は初期化時にポインタを NULL に
しておくと最初から realloc() で追加ができるので少し楽。


393 :デフォルトの名無しさん:2007/02/26(月) 21:35:39
>>373
TestDefが無限に増えつづけるようにしたいのなら
>>374も言ってるけど、最初に適当に1000件分とか読み込んで、
1000件以上なら500件分毎にでも領域確保すればいいよ。

counter1 = 0;
counter2 = 1000;

ptr = malloc(sizeof(struct TestDef) * 1000);

TestDef読込ループ(最後のTestDefまで) {
 if(counter1 = counter2) {
  counter2 = counter2 + 500;
  realloc(ptr, sizeof(struct TestDef) * counter2);
 }
 TestDef1件読込
 counter1 = counter1 + 1;
}

394 :デフォルトの名無しさん:2007/02/26(月) 21:50:20
ちょ 志村reallocの戻り値〜

395 :デフォルトの名無しさん:2007/02/26(月) 22:24:21
メモリブロック変わったらまずいねぇ

396 :デフォルトの名無しさん:2007/02/26(月) 22:25:22
>>393
増加量を500とか決め打ちにするとコピーにO(N^2)のコストがかかるからお勧めできない。
次のバッファサイズ = 現在のバッファサイズ * 2 とかだとO(N)で出来るのでお勧め。

397 :デフォルトの名無しさん:2007/02/26(月) 22:25:29
教えてください。

【キーボードからデータを5つ入力する。
次に入力するデータは、
何番目に入力したデータと一致するか表示するプログラム。】

398 :デフォルトの名無しさん:2007/02/26(月) 22:33:17
宿題なら宿題スレがあるよ。

399 :デフォルトの名無しさん:2007/02/26(月) 22:34:07
>>397
未来予知?

400 :デフォルトの名無しさん:2007/02/26(月) 22:35:27
>>396
顧客の増加の仕方によると思います
今3000件として顧客の増加率が低いのに6000件分も領域確保するのは無駄が多すぎ

401 :デフォルトの名無しさん:2007/02/26(月) 22:40:05
>>399
6番目に入力したデータは何番目と一致するかってやつだとは思うんですけど、

全然わかんないんで誰か教えてもらえませんか?

402 :デフォルトの名無しさん:2007/02/26(月) 22:46:04
>>401
データってなに?
文字?文字列?整数?浮動小数点数?

403 :デフォルトの名無しさん:2007/02/26(月) 22:48:31
>>402
整数です!

404 :デフォルトの名無しさん:2007/02/26(月) 22:48:42
>>396 >>400
そういうのはrealloc()の中でやってるから、変にに工夫しないで一件ずつふやせばいいよ。
そっちのほうがコードすっきり。

405 :デフォルトの名無しさん:2007/02/26(月) 22:51:38
リスト構造にしとけば

406 :デフォルトの名無しさん:2007/02/26(月) 22:58:01
>>396
そういう増加量の予測(?)の仕方ってどういう範疇を勉強すればいいのですか?
ぐぐるんで、キーワードだけでも教えてください

407 :デフォルトの名無しさん:2007/02/26(月) 22:59:54
>>404
だから顧客の増加率によるんだって
数件ならいいけど数百、数千なんて規模(数千は無いと思うけど)って場合1件づつだとオーバーヘッドが増すでしょ

>>403
テキトー↓

int main()
{
int i,a[5],b;
printf("5件分入力する(データとデータはスペースで空ける)>");
scanf("%d %d %d %d %d",&a[0],&a[1],&a[2],&a[3],&a[4]);
printf("いれろ>");
scanf("%d",&b);
for(i=0;i<5;i++) if( b==a[i] ) break;
if( i<5 ) printf( "%dは%d番目と一致",b,i+1);
else printf( "%dと一致するもんはねぇ",b);
return 0;
}

408 :デフォルトの名無しさん:2007/02/26(月) 23:07:51
>>407
数百レベルなら、オーバーヘッド気にしなくて一件単位で確保していけばいいよ。

標準入出力のバッファリングは効率悪いから、ラッパー作って独自でバッファリングを
実装してるような話じゃん。

409 :デフォルトの名無しさん:2007/02/26(月) 23:11:34
>>408
メモリ確保の話だけど

410 :デフォルトの名無しさん:2007/02/26(月) 23:15:40
>>409
「ような」


411 :デフォルトの名無しさん:2007/02/26(月) 23:18:33
>>410
もう少し噛み砕いてっ

412 :デフォルトの名無しさん:2007/02/26(月) 23:21:40
「reallocが内部実装で上手くやってるであろうことを自前で呼び出し側
で細々と書くのは、せっかくIOをライブラリ実装側でバッファリングして
いるのに自前でさらに外側にバッファリング処理を書くようなもの」とい
いたいのでしょう。


413 :デフォルトの名無しさん:2007/02/26(月) 23:35:37
>>412
私は馬鹿なようなので
>「せっかくIOをライブラリ実装側でバッファリング」
メモリ確保とどういう関係が?

414 :デフォルトの名無しさん:2007/02/26(月) 23:36:14
顧客の増加率によるってのは確かにそうおもう
自分がC言語で作って使ってる動的配列構造体は、
コンテナに相当する配列が一杯になったら次にどんだけ
増加させるかの部分を、ある程度までは*2で、ある程度
を越えると+nのようになるようにしてる(デフォルトでは)。
この「ある程度」はアプリによると思う。また、ここのある
程度を計算する部分を関数コールバックによる実装で作
っておくとアプリによって簡単に変更できていいんじゃ
ないかな
C++ならvector等を使えるけど、Cなら汎用的な動的配列
や汎用リスト、動的ハッシュイブラリみたいなの
自分で実装しておかないといろんなアプリ作るの大変だよ

415 :デフォルトの名無しさん:2007/02/26(月) 23:39:02
教えてください。

416 :デフォルトの名無しさん:2007/02/26(月) 23:43:09
reallocが内部で定数倍の拡張をしている実装ってあるのか?
一応調べてみたけど、手元のgccとvcではしてなかった。多分メモリ効率を考えてと思う。
どっちも固定量の増加で1ずつ増加する素直なコードだと数が増えると速度が目に見えて遅くなった。
自分が二倍伸張で書き直すと単純にほぼ線形時間で実行できた。
とりあえずreallocの伸張を信用することはあまりできなさそう。

417 :デフォルトの名無しさん:2007/02/26(月) 23:57:45
>>414
うんうん
私的には初期の段階(それこそ現在の入力数は数百程度)は*2でもいいと思う.
倍にしても大きな無駄領域生まないから.
店舗の顧客数にしても初期は新規会員がどっと来るからある程度予想して多めにしておくとか.
ある程度になると、小売ならちらほら程度だし、大手で各店管理じゃない)ならかなりの数になるだろうし.
で、過去の入力数とその間隔、もしくは単位時間当たりの入会数から動的に算出すればいいんじゃないかと.

>>416
そうだよね.指定したサイズのメモリ領域しか確保しないと思ってたんだけど↑のレスで、あーまた私わぁ〜勘違いしてたのかぁって思ったんだけど.


んで、私が言いたかったのは
「1件ごと reallocで確保する.で、たとえば予定の追加件数が200件あったとしてメモリ上に断片化が発生してた場合などに
数件ないし十数件ごとにブロックの変更があった場合、realloc内部で領域コピーが多発する」
ってことです



418 :デフォルトの名無しさん:2007/02/27(火) 00:02:24
>>413

「たとえ話」なんだから直接関係があるわけがないでしょう。


419 :デフォルトの名無しさん:2007/02/27(火) 00:06:49
>>418
はっ!
そか、たとえ話か
メモリのことをIOに例えてたのね
もう、明らかに関係があるのかと思ってしまったorz

420 :デフォルトの名無しさん:2007/02/27(火) 00:38:42
>>414
いつも*2でいくか、+nでいくか迷うけど、組み合わせるという手もあったのか!
でもしばらくは、*2でいくか、+nでいくか、組み合わせるかで試行錯誤することに
なりそうorz

421 :デフォルトの名無しさん:2007/02/27(火) 00:44:05
こんな文面も見つけました.
どこまで正しいか判らないですけど
連続領域でなくても、ブロック単位で確保して連結リストで管理ってのもいいかなと思いますけどね

http://www.ncad.co.jp/~komata/c-kouza6.htm より以下抜粋

 realloc()はmalloc()で割り当てた領域を拡張しますが、malloc()は大抵少し大きめに確保するのですが、その先が既に使用中の場合は拡張できず、新しい領域を求めてヒープを拡大し、そこに元のデータをコピーし、元のデータを開放します。
従って、realloc()とmalloc()がループで回るような場合はほとんど拡大ができず、毎回realloc()は新しい領域を求めてしまうことになり、メモリーのすき間がたくさんできてしまうことになります。
(中略)
これを回避するにはrealloc()する単位を大きめに取り、realloc()を呼び出す回数をできるだけ減らすしかありません。
それでも無駄は完全には無くせませんが、空きになるサイズが大きくなるので他のmalloc()がそこを使用できる確立が上がり、コピーの回数も減らせますので、速度も上がります。

422 :デフォルトの名無しさん:2007/02/27(火) 01:20:30
>>373からここまで話を盛り上げられるおまいらが大好きだ

423 :デフォルトの名無しさん:2007/02/27(火) 04:32:35
二つ質問があります

1:C言語に於いて、参照とはどういう意味なのでしょうか?

2:ifについて
if〜
return 1;

if〜
return 2;

とは、どういう意味でしょうか?

if〜

else if〜

とは違うのでしょうか?

424 :デフォルトの名無しさん:2007/02/27(火) 05:11:45
>>423
1 C言語だけに限れば変数の中身にアクセスするとかそんな感じ?
  "参照"単体ではうまく説明できん。

2 return文が入ってので何を質問してるのかよく分からないが、
前者は
もし〜ならreturn 1;
もし〜ならreturn 2;
であるのに対し後者は
もし〜なら・・・
     でなく〜なら・・・
というように前者はreturnが無ければ両方のif文が実行され
後者は当てはまる条件のところ以外は実行されない(switch文と同じ感じ)

後者にも同様にreturn文が入っているのなら、if文の内容しだいだが動作は同じ
(だが同じものとして覚えてはいけない。なぜならreturn文が入っているからに過ぎない)

425 :デフォルトの名無しさん:2007/02/27(火) 07:33:12
>>423
CにC++のような参照はないから、普通に国語辞典の一番か二番あたりにに載ってるような意味だろう。

426 :デフォルトの名無しさん:2007/02/27(火) 10:07:17
>>422
質問が曖昧だといつもこうやってぐだぐだになるんだよなあ・・・

427 :デフォルトの名無しさん:2007/02/27(火) 10:28:35
ファイル分割してグローバル宣言したいのですが、
//a.cpp
#include "game2.h"
#include "main.h"

extern int errorRog[1024];

・・・{
errorRog[0] = 0; //こちらで操作すると
//Error: 外部シンボル '_errorRog' が未解決
}
//b.cpp
#include "game2.h"
#include "main.h"

errorRog[0] = 0; //こちらで操作すると未定義

と注釈の通りで、原因は重複してヘッダを呼び出してるのがマズいんでしょうか?
できればヘッダにexternを組み込ませたいのですが
それ以前の問題でgame2.hには
//game2.h
typedef struct {
LPSTR cName; //名称
int cHp; //体力
}castData;

typedef struct {
castData cs[MAX_INPUT]; //キャスト
}cardData;
a.cpp,b.cpp共に呼び出す必要のある構造体の宣言があるのですが
重複して呼び出したらダメですよね?

428 :427:2007/02/27(火) 11:36:30
あ、何か勘違いしてたかも。すみません

429 :427:2007/02/27(火) 12:20:49
ごめんなさい。externについて勘違いしていたようで
本コードにも宣言しないといけないんですね。

430 :デフォルトの名無しさん:2007/02/27(火) 12:36:58
C言語のmakefile本を買いたいんですけですけどオススメってありますか?
K&Rのプログラミング言語C第2版的な位置付けの本がいいです。
そうでなくても、これ読んでないとモグリみたいなのを教えてください・・

431 :デフォルトの名無しさん:2007/02/27(火) 14:52:46
int a;
int *pa = &a;

これおかしくね?
*pa = &a; 何で値にアドレスを代入するの

432 :デフォルトの名無しさん:2007/02/27(火) 14:59:15
その*はポインタの指す値を得る演算子ではなく、int*という型の一部。


433 :デフォルトの名無しさん:2007/02/27(火) 15:56:17
>>427-429
extern をヘッダファイルに書けば万事解決

434 :デフォルトの名無しさん:2007/02/27(火) 15:59:04
>>373です。
レス遅れてすいません。
皆さんレスどもです。
頑張ります。

435 :デフォルトの名無しさん:2007/02/27(火) 16:46:42
>>431
規格でそう決まっているから、としか言いようがない

436 :デフォルトの名無しさん:2007/02/27(火) 16:50:48
>431
代入と初期化は別だから

437 :デフォルトの名無しさん:2007/02/27(火) 16:55:02
>>387-390
ありがとうございました。

教えていただいたキーワードで検索したところ、ほかにも方法があったのでURL貼っておきます
http://www.tohoho-web.com/lng/199911/99110136.htm

438 :デフォルトの名無しさん:2007/02/27(火) 16:55:50
int x;
int &rx = x;

これおかしくね?
&rx = x; 何でアドレスにint型の変数を代入するの

439 :デフォルトの名無しさん:2007/02/27(火) 16:58:04
>438
スレタイ嫁

440 :デフォルトの名無しさん:2007/02/27(火) 17:09:41
>>431
int *pa = &a;
は、int *型の変数paにaのアドレスを代入してる

間接参照演算子の * とは全くの別物



441 :デフォルトの名無しさん:2007/02/27(火) 18:01:31
#include <stdio.h>
#include <ctype.h>

int main(void)
{
char str[80], *p;

printf("文字列を入力してください:");
gets(str);
p=str;

while(*p) {
*p++ = toupper(*p);
}

printf("%s\n", str); /* 大文字の文字列 */

return 0;
}
実行結果 hiro→HIRO

参考書のとおりにやったんですが、僕は実行結果がhIROになるとおもってました。
なぜかというと最初のp=strでstr[0]のアドレスがpに入りますよね。でwhileループで
一番最初に*p++ = toupper(*p)としていますが、この一文は最初にp++でpをインクリメントしてしまい
pはstr[1]を指し、str[0]を飛ばしてしまうとおもったのですが・・

わかりません。よろしくお願いします。

442 :デフォルトの名無しさん:2007/02/27(火) 18:04:33
後置インクリメント演算子では後でインクリメントされる。
*++p = toupper(*p);と書けば先にインクリメントされるので、
お前が想像しているとおりになるだろう。

443 :デフォルトの名無しさん:2007/02/27(火) 18:09:01
>>441
p++は副作用(オブジェクトの値の変化)を起こす式だから、
文の終わりやカンマ演算子などの副作用完了までの間に
pの値を参照することはできない。
そのようなコードを書いた場合、どのような挙動になるかは定義されていない

この場合、
p++; *p = toupper(*p);
とするのが正しい。

444 :デフォルトの名無しさん:2007/02/27(火) 18:13:40
>>443
前置インクリメント演算子くらい知っとこうや。

445 :デフォルトの名無しさん:2007/02/27(火) 18:14:50 ?2BP(222)
>>441
p++とtoupper(*p)のどちらが先に評価されるかは未定義。

446 :441:2007/02/27(火) 18:19:33
みなさん。どうもありがとうございます。
なんか、むずかしいですね。とりあえず、>>442さんのいうとおりにやると
僕の予想したようになりました。独習Cを読んでいるんですが、後置の場合
式の評価の後にインクリメントされるとかいてあったので、納得できました。

今回の件は一応はなっとくできました。ありがとうございました。

447 :441:2007/02/27(火) 18:21:09
>>443さん446さん、厳密に言うと未定義なんですね。これから勉強して
いくうちにわかると思いますので頭の片隅においておきたいとおもいます。
ありがとうございました。

448 :デフォルトの名無しさん:2007/02/27(火) 18:23:13
>>444
前置にしたって未定義に変わりはないがな

449 :デフォルトの名無しさん:2007/02/27(火) 18:24:58
>>445
へー

450 :デフォルトの名無しさん:2007/02/27(火) 18:28:31
どちらが先に評価されるかが未定義なだけではなく、
未定義なコードを一箇所でも書くと、
コード全体で何が起こるか未定義になるよ。

451 :デフォルトの名無しさん:2007/02/27(火) 18:30:31
つまり、導き出される答えは
「プログラムは奇跡で出来ている。」

452 :デフォルトの名無しさん:2007/02/27(火) 18:32:25 ?2BP(222)
>>446-447
いやいやいやいや。
この問題の本質はインクリメントが前置か後置かじゃないから。
右辺のpを先に評価するような処理系なら左辺のインクリメントを前に置こうが
後ろに置こうが結果は同じ。

453 :デフォルトの名無しさん:2007/02/27(火) 18:35:10
>>450
ソース読んでもどの順番か未定義にだったらお手上げだしね。(動かしつつ直せばいいけど)
>>441の参考書が悪いってことでFA?

454 :デフォルトの名無しさん:2007/02/27(火) 20:04:33
>>422
realloc()を使ってお手軽にすませましょうってコードで、増分どうこうって工夫してもしょうがないだろって
ことだったんだけどな。


455 :デフォルトの名無しさん:2007/02/27(火) 22:28:49
stdargのva_startやva_endてどこで何回書いてもいいですか?こんなかんじ、
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

char *strdup_printf (char *format, ...)
{
va_list argp;
char *buf=NULL;
int size=512, inclen = 512;
buf = calloc(1, size);
if (!buf) return(NULL);
va_start (argp,format);
n=vsnprintf(buf, size, format, argp);
va_end (argp);

while(n<1) {
size += inclen;
buf = realloc(buf, size);
if (!buf) return(NULL);
va_start (argp, format);
n=vsnprintf(buf, size, format, argp);
va_end (argp);
}
以下略

456 :デフォルトの名無しさん:2007/02/27(火) 23:07:35
manによれば、va_start/va_endは何度でもペアで使うことが出来る。



457 :デフォルトの名無しさん:2007/02/27(火) 23:15:02
>>455
複数回使える。

当然char* format の中身は"%s%s%d%s"みたいな形だよね?

458 :デフォルトの名無しさん:2007/02/27(火) 23:31:18
>>456,457
ありがとうございます。m(__)m

>当然char* format の中身は"%s%s%d%s"みたいな形だよね?
そゆことです。

459 :デフォルトの名無しさん:2007/02/28(水) 01:00:20
return -1
を返すとは、どういう事なのでしょうか?

return 0;
を返すと何が違いますかね?

460 :デフォルトの名無しさん:2007/02/28(水) 01:04:30
int x;

x = nanika();

nanikaがreturn -1としていたらxの値は-1になる。return 0なら0。
返ってくる値を特に利用しないのなら何を返しても良いし、return;
だけで何も返さないことにしてもよい。

返ってくる値の意味は作り手が決める。




461 :デフォルトの名無しさん:2007/02/28(水) 01:05:40
>return -1
>を返す

つまり、
return(return -1)

どうみてもコンパイルエラーです、本当に(ry

462 :デフォルトの名無しさん:2007/02/28(水) 01:10:19
>>460
>>461
特に意味はないのですね、ありがとうございました。

463 :デフォルトの名無しさん:2007/02/28(水) 01:24:23
#include <stdio.h>
#include <stdlib.h>

int compare(const void *a, const void *b){
int x = *((int *)a); /*void型のポインタを、int型ポインタにキャストして、そこにある値を求めます。*/
int y = *((int *)b); /*void型のポインタを、int型ポインタにキャストして、そこにある値を求めます。*/

if(x > y)
return 1;
else if(x < y)
return -1;
else
return 0;
}



464 :463:2007/02/28(水) 01:24:54
main(){
int nums[10] = {4,8,3,7,5,2,9,1,6,10};
int a = 7, i;
int *p;

qsort(nums, 10, sizeof(int), compare);
for(i = 0; i < 10; i++)
printf("%d", nums[i]);

printf("\n%dを検索します\n", a);
p = (int *) bsearch(&a, nums, 10, sizeof(int), compare);
if(p == NULL)
printf("%dは見つかりませんでした。\n", a);
else
printf("%dは配列nums[%d]にあります\n", a, p-nums);

return 0;
}

実行結果
c:\source>huroku
12345678910
7を検索します
7は配列nums[6]にあります

465 :463:2007/02/28(水) 01:31:23
わからない箇所が、複数あるので質問させて頂きます。

>>int compare(const void *a, const void *b){
の const void *bに入れる値はmainの中の何処にあるのでしょうか?

>>*((int *)a);
は何なのでしょうか?ダブルでポインタのマークがありますが・・・・
詳しい解説お願いします。

クイックソートのcompare >>qsort(nums, 10, sizeof(int), compare);
は、const void *a,を指すのでしょうか?

検索のcompare >>p = (int *) bsearch(&a, nums, 10, sizeof(int), compare);
は、const void *b,を指すのでしょうか?

ご助言、宜しくお願い致します。
なるべく簡単に・・・・初心者向けにご返答戴ければ、尚幸いです。

466 :デフォルトの名無しさん:2007/02/28(水) 02:23:02
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_NUM 100

int main(){
int n = -1;
int answer;

/*乱数の発生*/
srand(time(NULL));
answer = (rand() % MAX_NUM) + 1;

printf("数当てクイズ!1〜%dの数字を入力してね\n", MAX_NUM);
while(n != answer){
scanf("%d", &n);
if(n == answer-1 || n == answer+1)
printf("美味しい!\n");
else if(n > answer+1)
printf("もっと小さい数です\n");
else if(n < answer-1 )
printf("もっと大きい数です\n");
}

printf("正解です!\n");
return 0;
}

このソースに於いて、if(n == answer-1 || n == answer+1)の
answer+1やanswer-1の-1、+1はどうして付くのでしょうか?
そもそも、これらは何なのでしょうか?

467 :デフォルトの名無しさん:2007/02/28(水) 02:25:30
>>466
宝くじ一等前後賞のチェック

宝くじ一等は関係無いけど

468 :デフォルトの名無しさん:2007/02/28(水) 02:26:54
>>466
「美味しい」じゃなくて「惜しい」だね。


469 :466:2007/02/28(水) 02:30:30
>>467
???

>>468
お恥ずかしいです

470 :デフォルトの名無しさん:2007/02/28(水) 02:33:53
>>469
例えば、answer が 10 だとすると、
「惜しい!」ってぇのは何と何だ?

471 :デフォルトの名無しさん:2007/02/28(水) 02:37:59
>>465

>>>int compare(const void *a, const void *b){
>の const void *bに入れる値はmainの中の何処にあるのでしょうか?

qsort関数の最後の引数としてcompare関数の名前(関数ポインタ)を渡している。
これはqsort関数が配列の要素を比較するときに使う関数。
qsort関数では、aとbに並べ替え対象の配列の要素のいずれかを入れて、渡され
た関数を何度も呼び出す。

>>>*((int *)a);
>は何なのでしょうか?ダブルでポインタのマークがありますが・・・・

int x = *((int*)a)を分けて書くと、
int* a_int = (int*)a;
int x = *a_int;

qsortは、さまざまな型のデータを並べ替えることが出来なければならないの
で、比較関数を呼ぶ際には、比較対象の2データを指すポインタを汎用のvoid*
型で渡すように作られている。
受け取った側ではintの値として比較したいので、まずvoid*型のポインタを
int*型にキャストし、*で値を取り出している。

bsearchも同じような形で比較用の関数を何度も呼ぶ。

>クイックソートのcompare >>qsort(nums, 10, sizeof(int), compare);
>は、const void *a,を指すのでしょうか?
>検索のcompare >>p = (int *) bsearch(&a, nums, 10, sizeof(int), compare);
>は、const void *b,を指すのでしょうか?

意味が分かりません。


472 :デフォルトの名無しさん:2007/02/28(水) 02:59:52
>>465
>>const void *bに入る値はmainの中の何処にあるのでしょうか?
mainの中には無い。qsortのための比較関数を(関数ポインタ)。
第一引数int x = *((int *)a); が第二引数y = *((int *)b);より
小さい/等しい/大きいの順番で返す値も
0より小さい/等しい/大きい整数を返す。
bsearchも同様。bsearchは配列が整列済みでないと駄目。
>>*((int *)a)
かっこは中から見れば良い。まず、int型のポインタにキャストした。
そしてそのポインタが指してる値を知るには*を付けるということ。
例えば((int *)a)だけだと、int型のポインタにキャストしただけで
要は、それだとaが指してるアドレスを取り出すことになる。
そこで*をつけて、そのアドレスの指し示してる値を取り出す。

473 :463:2007/02/28(水) 04:13:41
>>471->>472
真にありがとうございます。

凄いとても難しいですね、ちょっとどころか
理解できないようなので出直してきます。。。
ポインタがとかの応用がさっぱりです。

>>int* a_int = (int*)a;
int x = *a_int;

こんなのも参考書には、載っていません
因みに上のソースはその参考書なのですが・・・


474 :デフォルトの名無しさん:2007/02/28(水) 05:04:58
>>473
ちなみに、malloc()の戻り値もvoid*型だよ
今の規格では、キャストしなくても良い、本来は
int *a = (int *)malloc(100 * sizeof(int));
ってするところint *a =malloc(100 * sizeof(int));でも良いようになってる
(ちなみに上記はint型サイズ100個分のメモリをヒープから借りる)
ま、とりあえずvoid型のポインタを使うときは、malloc()とかでない限り
本来の型にキャストすべし。
ま、勉強していくうちに、そのうちなれるよ。

475 :デフォルトの名無しさん:2007/02/28(水) 05:10:17
>int x = *((int *)a); /*void型のポインタを、int型ポインタにキャストして、そこにある値を求めます。*/
きっちり説明してあるように見えるのは気のせいか?

476 :473:2007/02/28(水) 05:19:47
丁寧にありがとうございます。
ひぃ〜難しい、void型のポインタとかを今参考書の索引を漁っていますが
やはり載っていない、キャスト演算やmalkcoのメモリー獲得も
本の解説と照らし合わせてますが、さっぱりなので参考書を買い直し
ここで解説して頂いた事を再度見直してみます。
ありがとうございましたノシ

477 :デフォルトの名無しさん:2007/02/28(水) 06:06:52
参考書に全て載っていると思うのが間違い。
とは言え、当てにならない参考書だねぇ。

478 :デフォルトの名無しさん:2007/02/28(水) 10:47:00
List9-9に示した関数をもとにして、文字列を後ろから逆に表示する
("SEC"を受け取ったら"CES"と表示する関数put_rstringを作成せよ。

という問題でオレはこうやったんですが
http://eggrice.no.land.to/up/src/tohoh0137.txt
もうすこしいい方法ないでしょうか?
stdio.hのみでおねがいします。

479 :デフォルトの名無しさん:2007/02/28(水) 11:21:43
 

480 :デフォルトの名無しさん:2007/02/28(水) 11:22:14
void revstr(char *str){
    char *endc = str;
    char *startc = str;
    //終端文字検索
    while(endc != '\0')endc++;
    endc--;
    for(;startc < endc;startc++,endc--){
        char tmp = startc;
        startc = endc;
        endc = tmp;
    }
}

481 :デフォルトの名無しさん:2007/02/28(水) 11:41:24
長い文字列から文字数の分だけ取得したいのですが、
strncpy(cD->cs[nxt].cBmp ,
//現在読み込んでいるポインタ-文字の長さ
readStr + i - txtLen ,
txtLen);
位置(i)も文字数(txtLen)も合っているのに取得できません。
何ででしょうか?教えてください。

482 :デフォルトの名無しさん:2007/02/28(水) 11:44:51
>>481
こうだろ
文字の長さ-現在読み込んでいるポインタ

483 :デフォルトの名無しさん:2007/02/28(水) 11:47:06
>>478

#include <stdio.h>
void put_rstring(char *c)
{
int i = 0;
while(*(c + i))
i++;
while(i > 0){
i--;
putchar(*(c + i));

}
}


484 :デフォルトの名無しさん:2007/02/28(水) 12:04:01
>>480
>>483
ありがとうございます。
添字のカウントの仕方は大体同じなんですね。

485 :481:2007/02/28(水) 12:07:31
>>482
う〜ん。分からん。
ポインタが先じゃないとおかしいのでは?
他の文字列なら代入できたのですが、cD->cs[nxt].cBmpがおかしいとか?

486 :481:2007/02/28(水) 12:22:39
サーセン。。。
NULL文字入れるところ
= '\0' じゃなくて == '\0'
やってた。なぜエラー出ないんだ・・・。
情報不足マジですみません。
でも午前中ずっとこれに悩んでたんです。

487 :デフォルトの名無しさん:2007/02/28(水) 12:24:47
>>485
もうちょいソースくらはい。

488 :デフォルトの名無しさん:2007/02/28(水) 12:28:23
>>486
その場合、比較演算子として真:1 偽:0のどちらかを返す。
エラーは出ません。

489 :デフォルトの名無しさん:2007/02/28(水) 14:17:57
>>486
コンパイラがエラー出すのは構文上の間違い、あるいは制約上の間違いのみ。
== '\0'でも構文的に間違いじゃないなら普通にバイナリ吐く。


490 :デフォルトの名無しさん:2007/02/28(水) 15:19:38
>>486
全ての警告が出るようにコンパイルオプションを与えるなり、
統合環境ならそう設定するなりしておくがいいよ。

131 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)