C言語なら俺に聞け( ..
[2ch|▼Menu]
136:デフォルトの名無しさん
07/10/17 20:55:26
>>135
誤解しそうな関数
rand_xtoy( 9 , 10 ) が返す値の範囲は?

137:デフォルトの名無しさん
07/10/17 21:12:55
>>136
サッカー見ながら書いたら間違ったw

int rand_xtoy(int lower, int upper) {
  return rand() / (INT_MAX + 1.0) * (upper - lower + 1) + lower;
}

138:137
07/10/17 22:02:12
なんか寝ぼけてるようだ…orz

int rand_xtoy(int lower, int upper) {
  return rand() / (RAND_MAX + 1.0) * (upper - lower + 1) + lower;
}

139:998
07/10/17 23:01:00
>>126
ごめんなさい。
ソースはうpできないんです。

140:デフォルトの名無しさん
07/10/17 23:17:53
>>139
バッファオーバーフローにより、
書き換えてはいけないところが書き換えられているか、
未初期化のポインタを操作している可能性が高いです

141:デフォルトの名無しさん
07/10/17 23:43:32
>>139
「fopenでエラーが出る」と判明しているのなら、
ファイルオープンに失敗したNULLポインタを使ってるんじゃないの?

142:デフォルトの名無しさん
07/10/18 00:55:45
分割コンパイルでなんかもうファイルの数がすげー多くなってきて
makeかけたら結構の行いくんだよね。

1つのファイルに2、3個の関数書くもの?

143:デフォルトの名無しさん
07/10/18 01:18:25
myheader.h:20: error: 配列の型が不完全要素型を持っています

20行めの関数プロトタイプ
void fileinput(char [][],int );

どういうエラーですか?


144:デフォルトの名無しさん
07/10/18 01:30:44
>>143
配列の要素数を省略できるのは最初の [ ] だけ。
void fileinput(char [][10],int );
とかにする必要がある。10 かどうかは知らんが。

145:デフォルトの名無しさん
07/10/18 01:40:41
>>143
>void fileinput(char [][],int );
二次元配列を受け取る時は、一次元目の要素数を指定しなければならない

void catch_two_dimensions_array(char s[][5] , int n){
int i;
for(i=0; i<n; i++) printf("%s",s[i]);
}

int main(){
char str[3][5] == {"hoge" , "hage" , "func"};

catch_two_dimensions_array(str , 3);
return 0;
}

なお、
void catch_two_dimensions_array(char (*s)[5] , int n);
としてもおk(結局同じこと)

146:デフォルトの名無しさん
07/10/18 01:47:52
>>122

分岐しないで絶対値をとる方法です。(普通使いません)

int abs(int x) /* |x| */
{
int mask = x >>(CHAR_BIT*sizeof(int)-1);
return (x + mask)^mask;
}

int minus_abs(int x) /* -|x| */
{
int mask = x >>(CHAR_BIT*sizeof(int)-1);
mask = ~mask;
return (x + mask)^mask;
}

147:デフォルトの名無しさん
07/10/18 02:06:50
>>122

1ライナーな符号変転(整数限定、マクロで書いてみた)

#define NEGATIVE(x) (~x+1)

これは有名だと思う。

148:デフォルトの名無しさん
07/10/18 02:42:08
>>142

1ファイルに関数1つなんて規則はない。
ある程度同じ関連のものは1ファイルにまとめた方が管理もしやすいと思う。
そのあたりは書いた人のセンスだろうが…。

1ファイル1関数にすると1関数の行数が多くなりがちと読んだことがあるが
本当なのかなぁ

149:デフォルトの名無しさん
07/10/18 02:44:13
関数を始める時に

int kansuu(int a, int b, char *c){

という風に書きますよね。
これを

int kansuu(a, b, c)
int a;
int b;
char *c;
{

と書き換えることができると聞いたのですが、コンパイルが通りません。
後者の書き方は一般的ではないのでしょうか?

150:デフォルトの名無しさん
07/10/18 02:46:31
>>149
Cでは出来るがC++では無理だったかと

151:デフォルトの名無しさん
07/10/18 02:51:30
ということは古い書き方ってことですか。前者を使う方が良さそうですね。

152:デフォルトの名無しさん
07/10/18 07:13:56
フリーのリンクソフトってある?
あったら教えてくれ

153:デフォルトの名無しさん
07/10/18 07:30:13
>>55のソースで予想通りの結果が出ません。

現在の時刻: 7:28:12.80
新しい時刻を入力してください:_

と表示されます。

154:デフォルトの名無しさん
07/10/18 07:33:05
>>153
.\time
.\time.exe

155:デフォルトの名無しさん
07/10/18 07:53:16
>>154
ありがとうございます。実行できました。

156:デフォルトの名無しさん
07/10/18 08:48:38
関数内に関数を書く方法は、いつできたのでしょうか?
C言語作成当初からあったのでしょうか?
(自分の環境がC99な為、C89等他の環境でもビルドできるか知りたいです)

157:デフォルトの名無しさん
07/10/18 08:50:57
C89じゃできないよ

158:デフォルトの名無しさん
07/10/18 14:17:05
>>156
大丈夫、C99でもできない。恐らくgccの拡張だろ。

159:デフォルトの名無しさん
07/10/18 14:38:12
>>関数内に関数を書く方法

C++でなおかつ関数じゃなくてクラスor構造体or共同体なら宣言できるが…。

gcc拡張使ってないから分らない…
(ヲイヲイ)

160:998
07/10/18 16:03:26
>>139
>>140
ありがとうございます!!
スタックサイズを無制限にしたら解決しました。

161:デフォルトの名無しさん
07/10/18 16:04:49
>>156
gccの拡張。
また、gccでも、CではできるがC++ではできない。

例:
void func(int x[], int y[], int n)
{
int i;
double average(int x, int y){
return (x + y) / 2;
}
for(i = 0;i < n;i++)
printf("%d\n", average(x[i], y[i]));
}

みたいな感じで使う(例が悪くてすまん)

162:デフォルトの名無しさん
07/10/18 16:25:47
始めて知ったが、果てしなく謎だな。
カプセル化したいんならC++でやるべきだろ

163:デフォルトの名無しさん
07/10/18 19:29:20
pascalはふつーに関数を入れ子にできたから、昔はCにもあればいいのにって思ってたよ。

164:デフォルトの名無しさん
07/10/18 19:36:17
double a,b;

if(b==0.0 || a%b!=0.0)
{

}

がコンパイル通らないんですが、doble型の%演算は

165:デフォルトの名無しさん
07/10/18 19:36:48
ミスりました

double a,b;

if(b==0.0 || a%b!=0.0)
{

}

がコンパイル通らないんですが、double型の%演算はできないんですか?


166:デフォルトの名無しさん
07/10/18 19:41:08
つ fmod

浮動小数点数の比較で ==, != を使うのはどうかと思うがな。

167:デフォルトの名無しさん
07/10/18 19:41:19
>>165

ないです。fmod関数を使ってください

168:デフォルトの名無しさん
07/10/18 19:43:20
わかりました!

169:デフォルトの名無しさん
07/10/18 19:46:27
どらえもんは何言語でできてるんですか?

170:デフォルトの名無しさん
07/10/18 19:49:21
>>169
Fortran

171:デフォルトの名無しさん
07/10/18 20:22:15
#include <stdio.h>
int main (void)
{
int a=0xFFFA;
printf("%d,%p",a,&a);
return 0;
}
仮に&aのアドレスが0012FF88だった場合に
1バイト目(FA)は0012FF88ですが、
int aの2バイト目(FF)のアドレス 0012FF89を
得るにはどうしたらいいでしょうか?

172:デフォルトの名無しさん
07/10/18 20:32:35
>>171
#include<stdio.h>
int main(void){
int a=0xFFFA;
printf("%d,%p\n", a, &a);
printf("%p\n", (char*)&a+1);
return 0;
}

173:デフォルトの名無しさん
07/10/18 20:37:14
intのバイトオーダーはCPUによって異なる

Windows(Intel)の場合はこうでなかったかな?

0012FF88 00
0012FF89 00
0012FF8A FA
0012FF8B FF

174:デフォルトの名無しさん
07/10/18 20:39:01
>>171
#include <stdio.h>

struct int_filter{
char byte[sizeof(int)/psizeof(char)];
};

int main (void)
{
int a=0xFFFA;
struct int_filter *f;

f = (struct int_filter *)&a;
printf("a:value->%d,address->%p",a,&a);
printf("filter:[0]->%p,[1]->%p,[2]->%p,[3]->%p"f->byte,f->byte+1,f->byte+2,f->byte+3)

return 0;
}

175:デフォルトの名無しさん
07/10/18 20:41:14
何故わざわざ構造体を……

176:173
07/10/18 20:42:23
まちがえたみたいね
無視してくださいw

177:171
07/10/18 20:48:12
>>172
できた〜〜〜ありがとうございます。

>>174
174さんのコピーして貼り付けたんですが、
コンパイルできませんでした。
初心者なのでソースが難しすぎてどこを直せばうごくかさっぱりですが
どうもありがとうです。


178:デフォルトの名無しさん
07/10/18 20:56:25
>>173

sizeof(int)==4なら

0x00FFFAは
FA,FF,00,00 でしょIntel系なら。
00,00,FF,FA の順ががモトローラ系(スペル忘れちった)

179:デフォルトの名無しさん
07/10/18 21:21:57
エンディアンの違いはいい迷惑。

180:デフォルトの名無しさん
07/10/18 21:51:54
>>177
>>174のヤツ。
psizeof→sizeofのタイプミス
2つ目のprintf、閉じる方の「"」の後ろに「,」が無い。文の最後に「;」がない。

ミス自体は初心者レベルのモンだな。
まぁどうでも良いけどな・・・

181:デフォルトの名無しさん
07/10/18 22:35:06
スタックとキューの初歩を勉強してるんですが。
#include <stdio.h>
#define MAX_SIZE 30
int stack[MAX_SIZE];
int sp = 0;

void push( int x )
{ stack[sp] = x;
sp++;}

int pop(void)
{ int x;
x = stack[sp-1];
sp--;
return x;}
〜スタックが空か判定(省略)〜


182:デフォルトの名無しさん
07/10/18 22:36:16
void show( void )
{ int i;
printf( "size = %2d:", sp );
for( i = 0; i < sp; i++ ){
printf( " %4d", stack[i] );
}
printf( "\n" );
}

int main()
{
push( 1 ); show();
push( 2 ); show();
push( 3 ); show();
printf( "pop: %4d\n", pop() );
printf( "pop: %4d\n", pop() );
printf( "すべてpopします...\n" );
while( !is_empty() ){
printf( " %4d", pop() );
}
return 0;
}

スタックの内容を少しずつ表示していくものなんですが、
これだとpush関数とpop関数の所は場合によっては危ないよ、と言われました。
ポインタとか使ったほうが良いんでしょうか?
危ない、の意味すらわかりません。分かる人居たら教えてください。

183:デフォルトの名無しさん
07/10/18 22:39:55
すたっくはSTLつかっとけ

184:デフォルトの名無しさん
07/10/18 22:40:20
たぶんpushやpopする前にバッファが残ってるかチェックしてないからじゃね

たとえばpushしてないのにいきなりpopするとか

185:デフォルトの名無しさん
07/10/18 22:44:34
しかし、STLはC++という罠。

>>181
ようするにMAX_SIZE以上pushしようとしたときと、
空の時にpopしようとしたときにまずい。

186:デフォルトの名無しさん
07/10/18 22:48:17
「危ない、の意味」をボカしてるのは、自分で考えさせようという親心?
なら俺も黙っとく。

187:デフォルトの名無しさん
07/10/18 22:48:19
>>181,182
pushする時にはオーバーフローしないか(配列から溢れないか)、
popの時にはスタックが空でないかチェックするのは鉄則
pushなら
if(sp < MAX_SIZE)
popなら
if(sp > 0)でチェックすればいい

188:186
07/10/18 22:50:08
(´д`;)

189:181
07/10/18 22:58:36
皆さんありがとうございます。
危ない、ってそれのことだったんですね。
push関数で最大値以上にpushしたらどうなるのか、エラー出てないし
まあ良いかと思ってたんですが、油断していました。
(181の最後で「空かどうか判定」の部分は省略しましたが、
そこのことだと思ってました。)
自分でちょっと直してみます。

190:デフォルトの名無しさん
07/10/19 06:02:19
#include<stdio.h>

int main(){
char *str="test";

str[1]='s';

printf("%s\n",str);

return 0;
}

これを試してみたのですが、何も表示されません。
どこが問題なのでしょうか?

191:デフォルトの名無しさん
07/10/19 06:10:36
釣りにしか見えない

192:デフォルトの名無しさん
07/10/19 06:27:51
>>190
ポインタや配列に関する知識が中途半端な証拠

193:デフォルトの名無しさん
07/10/19 06:37:35
char str[]="test";

194:デフォルトの名無しさん
07/10/19 06:42:43
>>190
それは処理系によって動作が異なる。
何も表示されないどころかエラー吐いて止まる場合もあるし、
>>190の望みと思われるtsstを表示して正常終了する場合もある。
つまり、コンパイルできるからといって書いてはいけないコード。

195:デフォルトの名無しさん
07/10/19 06:43:49
明らかに欠陥だな

196:デフォルトの名無しさん
07/10/19 06:45:17
でも、とりあえずstr[1]='s'をコメントアウトして
printf("%c",str);
とした場合には、ちゃんとeが表示されます。
これってつまりstr[1]には文字が入っているということですよね。
では何故そこに代入することができないのでしょうか?

197:デフォルトの名無しさん
07/10/19 06:59:28
>では何故そこに代入することができないのでしょうか?
そこってどこだと思う?

198:デフォルトの名無しさん
07/10/19 07:11:28
文字列の先頭アドレスからsizeof(char)一つ分進んだ所ではないのですか?
そこにsを代入しようと思うのですが。

199:デフォルトの名無しさん
07/10/19 07:26:45
とあるビルの2階に手紙を届けたいが届けることが出来ない。なぜだろう?
→そのビルへは階数に関わらず手紙を届ける事が禁止されている

200:デフォルトの名無しさん
07/10/19 07:32:38
こういう回りくどく説明してるのは傍から見てうざい

201:デフォルトの名無しさん
07/10/19 07:34:31
ポインタに代入した文字列はconstなんですか?では何故コンパイルエラーが出ないのでしょう?
出ないにしても、代入が無効になるだけだと思うのですが、表示すら何もされなくなるのは何故なのでしょうか。

202:デフォルトの名無しさん
07/10/19 08:46:11
文法的に正しくても配列のメモリ格納形式が処理系異存だから
うまくいかない環境もあり,うまくいく環境もある

203:デフォルトの名無しさん
07/10/19 08:48:31
>>201
配列とポインタが同じように扱える保証はないからな

204:デフォルトの名無しさん
07/10/19 10:52:15
プログラムの勉強を始めようと思って、分りやすい教科書を
探しているんですが、何かおすすめの本てありますか?
今手元にあるのはメディックエンジニアリングの「これから
はじめるC言語基礎の基礎」という本なんですが・・・・

205:デフォルトの名無しさん
07/10/19 10:58:28
nai

206:デフォルトの名無しさん
07/10/19 11:50:24
>>202-203
いやでもやってることは、文字列の先頭から2バイト目に文字を代入する、ってことですよね?
配列で宣言してもポインタで宣言しても、データがメモリに連続で格納される、という点は変わらないはずです。
いくら処理系依存と言っても、配列だけ何故か1KBごとに飛び飛びで格納する、
なんてトリッキーなことはしていないと思うのですが、しているのですか?
もしそうならば、わざわざ配列の格納方式だけ処理系依存にする意味なんてあるんですか?

207:デフォルトの名無しさん
07/10/19 12:04:51
>>206
文字列リテラルと配列の区別をつけよう。

208:デフォルトの名無しさん
07/10/19 12:05:18
とりあえずさ、
>>190のコードで実際にどんな値が入ってるか、確認してみれば?
printf("%d" , str[1]);
%cじゃなく%dで
もし代入失敗してるなら代わりに何が入ってるか確認できるし

209:デフォルトの名無しさん
07/10/19 12:12:01
>>207
機能として違うのはわかりますが、メモリの格納方式まで別々にする意味は何でしょう?
単に不便にしているだけとしか思えないのですが。

>>208
同じ値が入っていました。さすがにこれはおかしいと思い、VCのモードをReleaseに変えたら動きました。
しかし根本的な問題解決にはなっていません。何故こう無駄に不安定なのか…

210:デフォルトの名無しさん
07/10/19 12:27:50
無駄じゃないだろ

211:デフォルトの名無しさん
07/10/19 12:30:35
>>209
「このモジュールはデバッグモードでコンパイルして
こっちはリリースモードでコンパイルしないとダメだからな」

嫌すぎる…

212:デフォルトの名無しさん
07/10/19 13:22:06
>>209
文字列リテラルを使うときに、メモリを節約できるから。
つまり、次のコードは、同じ値を出力するかもしれない。
# コンパイラとオプションによって変わる
--
void exsample()
{
const char * foo = "abcde";
const char * bar = "abcde";
printf("%p, %p\n", foo, bar);
}
--
勿論、次のコードは只の配列だから違う値が出力される。
void exsample2()
{
char foo[] = "abcde";
char bar[] = "abcde";
printf("%p, %p\n", foo, bar);
}

213:デフォルトの名無しさん
07/10/19 13:23:23
げ、どうでもいいけど関数名がtypoだ _/ ̄|◯

214:デフォルトの名無しさん
07/10/19 13:29:26
自分が間違ってんのに仕様の方に文句をつけるやつは、Cどころか学習自体に向いてないよ

215:デフォルトの名無しさん
07/10/19 13:56:58
新しい言語作ればいいと思うよ

216:デフォルトの名無しさん
07/10/19 15:42:13
#include <stdio.h>
int main (void){
double a,b,c,x;
printf("Please type 1st Number >> ");
scanf("%xf",&a);
printf("Please type 2nd Number >> ");
scanf("%xf",&b);
printf("Please type 3rd Number >> ");
scanf("%xf",&c);
x=(a+b+c)/3;
printf("Average = %xf\n",x);

return 0;
}

なぜか、計算結果が違う・・・ %f が違うんでしょうか?

217:デフォルトの名無しさん
07/10/19 15:46:25
>>216
%xf を %lf にしてみたらどうかな?

218:215
07/10/19 16:07:13
>216
 ありがとうございました。

219:デフォルトの名無しさん
07/10/19 20:17:42
>>201
文字列リテラルの内容を書き替えるプログラムの挙動は未定義。

文字列リテラルの型はchar配列となっているが、これは過去との互換性のため。
蛇足だがC++ではconst charの配列となっている。
(ただし、またも互換性のためchar*への型変換は定義さらている)

>>206
組み込みではROMに配置できるようになる。

Windowsなど高水準なOSでは、規格の規定から
文字列リテラルの書換はするべきでないと
認知されているため、文字列リテラルが
格納されている辺りを読取専用にする。

220:デフォルトの名無しさん
07/10/19 21:09:41
まぁ結局ROMに配置すんのもメモリの節約だし、
「メモリの節約のため」でまとめちゃってもいい気もするけどね。

なんかメモリの節約以外の理由で文字列リテラルはROMのが良い理由があったら、
後学のために教えたって欲しいかも。

221:デフォルトの名無しさん
07/10/19 21:39:11
まぁROMは遅いから結局実行時にRAMにコピーしちゃったりるすんだけどね

222:デフォルトの名無しさん
07/10/19 22:18:08
開いたりしていないファイルポインタを
fclose(fp); とすると、どうなるのでしょうか?

223:デフォルトの名無しさん
07/10/19 22:21:13
fclose関数でエラーが返されると思います。

224:デフォルトの名無しさん
07/10/20 12:19:02
>>222
詳しく言うと、エラー時にはEOFが返される。
成功時は0が返される。

225:デフォルトの名無しさん
07/10/20 13:31:04
その前に開いてない fp ってどっから持ってくるんだ
NULLかゴミ値じゃねぇの?

226:デフォルトの名無しさん
07/10/20 13:47:34
FreeBSD系だとfcloseにNULLを渡したら例外が起きるらしい。
以下はMac OS X Tigerのfclose(3)から引用

> The fclose() function does not handle NULL arguments; they will result in
> a segmentation violation. This is intentional - it makes it easier to
> make sure programs written under FreeBSD are bug free. This behaviour is
> an implementation detail, and programs should not rely upon it.

実際にfcloseにNULLを渡してみたらsegvが発生した。
おっしゃるとおりの御利益はあるかもしらんが、ちゃんと規格に準拠しようぜ…

227:デフォルトの名無しさん
07/10/20 18:16:47
例えば
const char test[] = {"abcdef"};

cとdの間に0x04を入れたい場合どう書けばよいのでしょうか


228:デフォルトの名無しさん
07/10/20 18:31:08
"abc\x04def"

229:227
07/10/20 18:42:47
了解


230:デフォルトの名無しさん
07/10/20 19:12:41
"abc\04def"とも書けなっかったかな。
\04は8進表記。


231:デフォルトの名無しさん
07/10/20 20:04:00
doble型の変数をprintfで表示するときには整数で表示するにはどうしたらいいですか?


232:デフォルトの名無しさん
07/10/20 20:08:21
double x = 1;
printf("%d\n", (int)x);
こうか?

233:デフォルトの名無しさん
07/10/20 20:08:42
>>231
%.0f

234:デフォルトの名無しさん
07/10/20 20:09:56
>>232
>>233
どちらでもできました!ありがとうございました

235:デフォルトの名無しさん
07/10/20 20:30:34
今までCとC++は同じものだと思っていたけれど、
MFCを使ったC++プログラミングは、C言語と似ているようで
似ていないですね。

236:デフォルトの名無しさん
07/10/20 20:36:52
C++はCの拡張だから、Cと同じように書くこともできる
単にC++をCとして使ってただけだろ

237:デフォルトの名無しさん
07/10/20 20:37:27
BetterC

238:デフォルトの名無しさん
07/10/20 20:40:47
CとC++は全然違う言語だと思ってもいいよ
クラス、例外処理、テンプレート、新たに覚えることはたくさんある

239:デフォルトの名無しさん
07/10/20 21:02:21
>>238 の言うとおり、別物と認識した方がいい。
同じだと思っている人と一緒に仕事するとよーっくその事を実感することになる。

240:デフォルトの名無しさん
07/10/20 23:10:59
引数の数が可変の関数の作り方を勉強したのだが、
printfって、%fでdouble型もfloat型も受けるよな?

それが、よく分らなくなった。

double型とfloat型って、サイズが違うはずだから、
引数から取り出すとき、区別がつかなくて、おかしくならないか?


241:デフォルトの名無しさん
07/10/20 23:13:34
URLリンク(www.kijineko.co.jp)

というわけで、可変引数だと暗黙的にfloatはdoubleに変換されるらしい


242:デフォルトの名無しさん
07/10/20 23:13:52
可変引数では int以下→int、float→double になる

243:デフォルトの名無しさん
07/10/20 23:50:12
>>240
でもそういうのってコンパイラによって違うのでは?
それってANSI Cで決められてたっけ?

244:デフォルトの名無しさん
07/10/21 00:07:10
>>243
ANSIというか規格で決まっている。
floatは受ける型がわからない関数に渡されるときはdoubleに格上げされる。
これはプロトタイプの与えられていない関数の引数、あるいは可変引数のときに起こる。

なので、printfに渡すときはfloatもdoubleもどちらもdoubleとして渡されることになる。

似たようなことがcharにも言えて、これはintに格上げされる。

245:デフォルトの名無しさん
07/10/21 01:21:25
ちょっと聞きたいんだけど
#include "myheader.h"

int main(){

int list_num[100];
FILE *fp;
int i;
char buf[100][30];

というプログラムの最初の部分において

gcc -c main.c
main.c: 関数 `fgword' 内:
main.c:3: error: 文法エラー before '{' token
main.c:9: error: 文法エラー before "fp"
make: *** [main.o] エラー 1

main関数内でいきなりこういうエラーがでるんだけど
どういうことなんでしょうか?
main関数内にfgwordは使ってないんですけど


246:デフォルトの名無しさん
07/10/21 01:22:49
たぶん myheader.h の中がおかしい

247:デフォルトの名無しさん
07/10/21 01:35:24
myheader.hの中身のプロトタイプの
int fgword(int);
にセミコロンがなかったからこういうエラーがでたようです。
ありがとうございます。

突然こんなエラーでてきてびびった。


248:デフォルトの名無しさん
07/10/21 03:41:30
デスクトップパソコンで
処理させるのと
ノートパソコンで処理
させるのと
音が違うな。
デスクトップはうるさくてやってられない。
実行に10分くらいかかるプログラムを動かしてるとき
デスクトップだとかなり沸いてくるし。

249:デフォルトの名無しさん
07/10/21 03:45:40
URLリンク(videointroplayer.web.fc2.com)

250:デフォルトの名無しさん
07/10/21 12:38:50
1bitのファイルはつくれるんでしょうか?
charだと8bitになってしまいます

251:デフォルトの名無しさん
07/10/21 12:39:12
char* ch;
ch = "test1";
ch = "test2";

↑で"test2"を代入した時点でメモリリークしてますか?

252:デフォルトの名無しさん
07/10/21 13:11:01
>>251
メモリリークの意味を考えてください
確保したメモリを使用後も開放せずにいることですよ
で、それは該当すると思いますか?
そもそも領域確保していないのに

253:デフォルトの名無しさん
07/10/21 13:13:03
>>251
「動的に」が抜けてた

静的に確保されたものは終了後、自動的に開放されます


254:デフォルトの名無しさん
07/10/21 13:59:07
スレッドが開始される前に、mainで全ての処理を終えてしまうようです
そのためスレッド稼働中の判定がうまくいきません どうしたらいいですか?

#include <process.h>
#include <stdio.h>
#include <windows.h>

void fnc(void *p){
int m=(int) p;
Sleep(m*400);
printf("%d end\n",m);}

main(){
HANDLE m[10]; DWORD tp[10];
int n=0,k;
for(k=0;k<10;k++)tp[k]=0;k=0;
while(n<100){
GetExitCodeThread(m[k], &tp[k]);
if(tp[k]!= STILL_ACTIVE){
m[k]=reinterpret_cast<HANDLE>(_beginthread(fnc, 0, (void *)n));n++;}
k++;}
Sleep(10000);}

255:254
07/10/21 14:04:27
まちがえました

256:254
07/10/21 14:11:11
HANDLE m;
DWORD flg;

m=reinterpret_cast<HANDLE>(_beginthread(fnc, 0, NULL));
このようにスレッドを開始したとき、スレッドが終わると次の関数を終了コードを返すはずですよね?
GetExitCodeThread(m, &flg);

なんかいつまでもアクティブのままなんですが

257:254
07/10/21 14:18:10
_beginthreadは終了しても終了コード返しませんか?

258:デフォルトの名無しさん
07/10/21 14:20:02
なんかクリエイトスレッドは、不都合があるってかいてあったんですけどこっちのほうがいいですか?

259:デフォルトの名無しさん
07/10/21 14:29:28
URLリンク(msdn2.microsoft.com)(VS.80).aspx

>start_address で起動されるルーチンは、__cdecl 呼び出し規約を使用する必要があり、戻り値を持つことはできません。

260:デフォルトの名無しさん
07/10/21 14:36:49
_beginthreadexを使ったらうまくいきました

261:デフォルトの名無しさん
07/10/21 14:56:09
質問なんですけど、全てのスレッドが終了したら停止したいんですけど、最後の部分の判定は駄目なんでしょうか?
なんか作業が終わる前に停止してしまいます

#include <process.h>
#include <stdio.h>
#include <windows.h>
#define ThreadNum 100

unsigned __stdcall fnc(void* p){
int m=(int) p;
Sleep((m%10)*10);
printf("%d end\n",m);}

main(){
HANDLE m[ThreadNum];
DWORD tp[ThreadNum];
int n=0,k;
for(k=0;k<ThreadNum;k++)tp[k]=100;k=0;
while(n<100){
GetExitCodeThread(m[k], &tp[k]);
if(tp[k]!= STILL_ACTIVE){
m[k]=reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, fnc, (void*)n, 0 ,NULL));n++;}
k++;if(k>=ThreadNum)k=0;}

do{n=0;
for(k=0;k<ThreadNum;k++){
GetExitCodeThread(m[k], &tp[k]);
if(tp[k]!= STILL_ACTIVE)n++;}
}while(n>=ThreadNum);
}

262:デフォルトの名無しさん
07/10/21 14:57:22
すべてのスレッドがアクティブでは無いとすれば、作業が全てすんでいると思うのですが

263:デフォルトの名無しさん
07/10/21 14:57:52
いい加減スレ違いだって気づけ

264:デフォルトの名無しさん
07/10/21 14:58:41
すみません 解決しました
一番最後は
while(n<ThreadNum);
でした

265:デフォルトの名無しさん
07/10/21 15:19:53
停止を待つなら
for(n=0; n<ThreadNum; n++)
{
if(m[n]) WaitForSingleObject(m[n], INFINITE);
}

というかreinterpret_castってC++じゃねーかww

266:デフォルトの名無しさん
07/10/21 15:30:27
>>265
それはEXではない方の場合でしょうか?

267:デフォルトの名無しさん
07/10/21 15:34:46
マルチスレッドという時点でVisual C++依存
よってCの範疇ではないのでスレ違い

268:デフォルトの名無しさん
07/10/21 15:46:23
マルチスレッドなんて素人が無理に使うもんじゃないよ。


269:デフォルトの名無しさん
07/10/21 16:16:06
こういう簡単なポインタに関するプログラムがあるんですが、
実行するマシンによって(無論コンパイルはそのコンピュータ上でやり直している)
値が変動したりしなかったりします。
どうしてでしょうか?
---------------------------------------------------
#include <stdio.h>
main(){
int i,*x;
x=&i;
*x=1;
printf("x=%o *x=%d\n",x,*x);
}
---------------------------------------------------
コンパイルコマンドは gcc hoge.c
以下は4回分の出力を横に並べたもの

Fedora7
x=27775464634 *x=1, x=27747676054 *x=1, x=27773760474 *x=1, x=27764163514 *x=1

Vine
x=27767545704 *x=1, x=27770645104 *x=1, x=27777542624 *x=1, x=27775054324 *x=1

OS X(10.3)
x=27777776240 *x=1, x=27777776240 *x=1, x=27777776240 *x=1, x=27777776240 *x=1

HP-UX
x=17777772540 *x=1, x=17777772540 *x=1, x=17777772540 *x=1, x=17777772540 *x=1


270:デフォルトの名無しさん
07/10/21 16:19:54
*xの値が変わってないんならどうでもいいことじゃね?

271:デフォルトの名無しさん
07/10/21 16:21:56
OSのメモリ管理法にもよるだろ。

272:デフォルトの名無しさん
07/10/21 16:24:15
>>269
xは変数iのアドレス(スタック上の)
OSによって異なるだろうし、同じOSでもコンパイラによっても異なる

273:デフォルトの名無しさん
07/10/21 16:27:19
質問があるんですが

int input(char *pstr1)
{
char *ppstr1;

fgets(pstr1,SIZE_ARR,stdin);
fflush(stdin);
ppstr1=strchr(pstr1,'\n');
if(ppstr1!=NULL){
*ppstr1='\0';}
return 0;
}

このコードは、fgets関数で読み込んだ文字列から改行記号を探し
ヌル文字と改行文字を入れ替えをするということをしてるんですが
「*ppstr1='\0';」は、なぜ間接演算子抜きの「ppstr1='\0';」ではダメなんでしょうか
ご教示ください

274:デフォルトの名無しさん
07/10/21 16:30:24
>>270-272
なるほど、ありがとうございました。

275:デフォルトの名無しさん
07/10/21 16:39:43
>>273
strchrは見つかった場所へのポインタを返すから、char *型のppstr1で受け取ってるだろ?
char *型、つまりアドレスを表してるわけだから、ppstr1だけだと、その見つかった場所のアドレスになるんだ。
だから、アドレスを書き換えても意味がない。
ここでやりたいのは改行をヌル文字に変える作業だから、ppstr1というポインタを介して値を変更しないといけない。
だから、間接参照演算子を使って代入作業を行わないと駄目ってこと。

276:デフォルトの名無しさん
07/10/21 16:43:25
>>273
ところでstdinからfgetsで取得したデータの改行は\0に変換されていなかったっけ?
まちがっていたらソマソ

277:デフォルトの名無しさん
07/10/21 16:45:34
>>276
変換というより、最後に\0を付加するんだよ。

278:デフォルトの名無しさん
07/10/21 16:49:55
>>276
そいつは多分getsと勘違いしてるとオモ。
getsは最後の改行コードを文字列に含まない。
fgetsは改行コードを文字列に含む。

279:276
07/10/21 16:54:10
>>278
なるほど納得

280:273
07/10/21 16:56:00
>>275
なるほど・・・
易しい説明どうもありがとうございました!

281:デフォルトの名無しさん
07/10/21 16:58:54
地銀はマーチが多いよ

282:デフォルトの名無しさん
07/10/21 17:00:34
↑誤爆

283:デフォルトの名無しさん
07/10/21 17:00:41
大文字か小文字かどっちだ?

284:デフォルトの名無しさん
07/10/21 17:34:01
一般的に、スレッドの関数はインライン展開できますか?

285:デフォルトの名無しさん
07/10/21 17:40:37
>>284
日本語でおk

286:デフォルトの名無しさん
07/10/21 17:41:03
for ( k=0; k<10; k++ ) x+=f(k); というのはインライン展開しませんか?

x= f(0) + f(1) + ・・・ だとインライン展開しますか?

287:デフォルトの名無しさん
07/10/21 17:46:41
内部でfor, while, switchを使った関数はinllineの指定をしてもinline展開されないみたいだよ

288:デフォルトの名無しさん
07/10/21 17:48:40
それならprintfを使っても駄目ですよね

289:デフォルトの名無しさん
07/10/21 20:17:10
初歩的な問題ですみません。

等比数列の初項aと公比rを入力し、格項の値とn項までの総和を計算し出力せよ。ただし、r!=1とする。(for文を使用する)

等比数列: a, ar, ar^2,・・・・・ar^(n-1)
等比数列の和:Sn=a+ar+ar^2+・・・・+ar^(n-1)


for文の部分だけでもお願いします。

290:デフォルトの名無しさん
07/10/21 20:18:41
それは質問じゃないだろ
宿題スレ行け

291:デフォルトの名無しさん
07/10/21 20:22:34
>>288

printfは非inlineな関数だから関係ないような気がするけど…。

292:デフォルトの名無しさん
07/10/21 20:22:44
>>290
申し訳ない。宿題スレの存在しらなかったっす

293:名無し
07/10/21 21:58:06
配列名のsumって何?

294:デフォルトの名無しさん
07/10/21 22:01:21
英和辞書にでも聞け

295:名無し
07/10/21 22:12:13
なるほど。

296:デフォルトの名無しさん
07/10/22 15:14:45
void add1(int i);
int add2(int i);
void add3(int *p);
int main(void)
{
int n; /* n の値の変化に注目する */
    printf("Input integer: ");
scanf("%d", &n);
printf("Original: %d \n", n);

???????; /* 関数add1 に nを適用する */
printf("After Add1: %d \n", n); /* 関数add1 を適用した後の nを表示する */
printf("Add2: %d \n", ???????); /* nを適用した関数add2 の値を表示する */
printf("After Add2: %d \n", n); /* 関数add2 を適用した後の nを表示する */
     ???????; /* 関数add3 に nを適用する */
printf("After Add3: %d \n", n); /* 関数add3 を適用した後の nを表示する */
return 0;
}
void add1(int i) /* i に1を加えて,表示する */
{
???????}

int add2(int i) /* i に1を加えた値を返す */
{
???????
}
void add3(int *p) /* ポインタの指す値に1を加えて,表示する */
{
???????
}
????の部分を埋めてください。

297:デフォルトの名無しさん
07/10/22 15:17:57
そういうのは宿題スレへ
スレリンク(tech板)

298:デフォルトの名無しさん
07/10/22 16:09:03
VS2005でC言語の勉強をしています。

char str[]="日本語";

のような感じで、文字列リテラルとしてUTF-8を指定することは可能でしょうか?
ソースの文字コードをUTF-8にしても、strにはSJISのコードが入ります。

299:デフォルトの名無しさん
07/10/22 18:15:23
wchar_t str[] = L"日本語";

で UNICODE が使える。文字コードは処理系依存
どうしても UTF8 が必要なら変換するしかないと思う。

300:デフォルトの名無しさん
07/10/22 18:27:11
配列を大量に使ってプログラム書いてるときに気をつけないといけないことはなに?
領域こえたらセグメンテーションでるのはわかる。

301:デフォルトの名無しさん
07/10/22 18:29:18
>>300
全然分かってないじゃん

302:それはセグメンテーションフォルトだろう
07/10/22 18:30:41
>>300
おまえは何か勘違いしている。領域を越えたらセグメンテーションが出ると言うわけではない。

303:デフォルトの名無しさん
07/10/22 18:40:05
わかってないからきいてんじゃん

304:デフォルトの名無しさん
07/10/22 18:42:01
配列を大量に使うプログラムにろくなのが無いこと

305:デフォルトの名無しさん
07/10/22 18:43:36
あれをリストで実装はできない

306:デフォルトの名無しさん
07/10/22 18:46:45
どんなアルゴリズム?

307:デフォルトの名無しさん
07/10/22 20:18:18
配列好きだけど

総素数の最大数が分かっているときはリストなどより配列を使ったほうが
プログラムは簡単になるし、性能もいいのができる。

ただし、以下のことは注意しなくてはいけない。
1.要素数の最大値が決まっていないとき
  最大数を超えたときにリアロケートするという手もあるが、そういう時はリストにする。
2.中身がスカスカの配列
  メモリーの無駄。メモリーが十分あればそれでも良い。
3.配列が確保できない
  スタック上に配列を作成するときはよくある。
  こういうときはヒープは外部変数にとる。

308:デフォルトの名無しさん
07/10/22 22:40:56
fgetsで入力のおわりを'\0'にする方法ってありますか?
scanfだと空入力したとき結果が出ないし
getsは禁止らしいので
fgetsしか使う方法がないのですが・・・

309:デフォルトの名無しさん
07/10/22 22:43:06
>>308 >>273

310:デフォルトの名無しさん
07/10/22 23:40:50
>>308
fgetsで読み込まれた文字列の改行文字の後は'\0'です。
改行文字を含めたくないなら 273 の方法です…。

311:デフォルトの名無しさん
07/10/22 23:48:13
fgetsは自動的に\0で終わる
改行文字が付いてるのを気にしないなら何もする必要なし

312:デフォルトの名無しさん
07/10/23 01:06:28
img_data = (HOGE)malloc( sizeof( GEHO ) * img_height );
for ( int i = 0; i < img_height; i++ ) {
img_data[i] = (HOGE)calloc( sizeof( GEHO ), 3 * img_width );
}
とメモリを確保した場合、どのようにメモリを開放したらいいのでしょうか?

313:デフォルトの名無しさん
07/10/23 01:45:44
for ( int i = 0; i < img_height; i++ )
free(img_data[i]);

free(img_data);

314:デフォルトの名無しさん
07/10/23 01:53:37
>>312
img_dataの型がよく分からないのだが……
img_dataもimg_data[i]も両方HOGE型てなんなん

int **ar,i;
ar = (int**)malloc(sizeof(int*)*HEIGHT);
for(i=0; i<HEIGHT; ++i) ar[i] = (int*)malloc(sizeof(int)*WIDTH);
こういうのをイメージしてるなら、こう↓
for(i=0; i<HEIGHT; ++i) free(a[i]);
free(ar);

315:デフォルトの名無しさん
07/10/23 02:12:47
>>307
ありがとう。
種類の違うデータを二次元配列にいれたりしてるんだけど、
printfで表示させてもあっているのに、
あるアルゴリズムをかけると変な値がでるんだよなー。

ある空白の二次元配列の1行ずつに、違う二次元配列の1行ずつを代入して
足し算していくような感じのプログラムなんだけど。
計算が対数計算だから場合わけが非常に精密にしないとだめなんだよね。



316:312
07/10/23 02:13:07
ありがとうございます。
img_dataを開放しても、img_data[i]は開放されないんですね。



317:プリンがー
07/10/24 00:15:56
1から10の2乗を3桁で表示するプログラムを作れ。

#include<stdio.h>
void main (void)
{
int x i;
double y;

for(i=0;i<=9;i++){
printf("数値を入力して下さい");
scanf("%d",&x);

y=x*x;

printf("y=%3lf\n",y);

}
return0;

}




であってますか?


318:デフォルトの名無しさん
07/10/24 00:24:43
>>317
10の二乗は?
というか、実行すればいいだろ

319:デフォルトの名無しさん
07/10/24 00:28:55
>>312
exit(0);

320:318
07/10/24 00:29:56
>>317
ごめ 間違えた
#include<stdio.h>
int main(void)
{
int i, x;
for(i=1;i<=10;i++){
printf("%d の二乗を入力して下さい : ", i);
scanf("%d", &x);
printf("%3d\n", x);
}
return 0;
}

321:デフォルトの名無しさん
07/10/24 01:00:02
printf("%3d\n", x);
printf("%3d\n", x);
printf("%3d\n", x);

322:デフォルトの名無しさん
07/10/24 02:18:57
コマンドプロンプトでコンパイルするような
無償コンパイラが欲しいんですがないですか?

323:デフォルトの名無しさん
07/10/24 02:20:05
問題に反してるだろ?1〜10の二乗を表示なのに、11以上の二乗も表示できるようになっとるぞ?フローチャートなどで考えたらどうだ?ただプログラムを組むだけでは、上達しないよ。

324:318
07/10/24 06:12:02
>>322
MinGW
Visual C++ 2005 Express
Lcc
cint
LSI-C86 評価版

325:318
07/10/24 06:13:11
printf("%d の二乗を入力して下さい : ", i);
scanf("%d", &x);

x=i*i;

326:デフォルトの名無しさん
07/10/24 10:29:58
>フローチャートなどで考えたらどうだ?
なるほど、>323のようになれると。

327:デフォルトの名無しさん
07/10/24 12:04:28
>>322
Turbo-C 2.01
URLリンク(bdn.borland.com)
お薦め。

328:プリンがー
07/10/24 12:29:22
プログラム演習の初心者からできるいい問題集ありませんかね?
大学生協は置いてなくて・・・
講義では問題解くってことはしないのでorz

329:318
07/10/24 12:41:42
>>328
推薦図書/必読書のためのスレッド 37
スレリンク(tech板)

330:デフォルトの名無しさん
07/10/24 12:42:28
Boland C++ Compiler
が抜けてるな

331:プリンがー
07/10/24 12:53:45
>>318
プログラムってどこで実行できるんすか??


332:デフォルトの名無しさん
07/10/24 12:54:43
NG

333:takumi
07/10/24 14:13:59
XPでvisualstudioを使ってます。
問題:長さ100のint型配列 int a[100]がある。a[0]〜a[99]には整数が収められているする。
この100個の中で一番小さい数を求め、画面に出力するプログラムを作成せよ。
出力形式は「ans.=???」とせよ。???の部分は答え。

なんですが、全くわからないので教えて下さい。。

334:デフォルトの名無しさん
07/10/24 15:08:21
宿題スレへ
スレリンク(tech板)l50

335:デフォルトの名無しさん
07/10/24 16:24:03
コテ付目欄空欄…
どこの中学生掲示板だよ

336:デフォルトの名無しさん
07/10/24 17:59:26
つか入力がわかっているのになぜscanfを使う必要あるんだよ。

337:デフォルトの名無しさん
07/10/24 21:19:58
未経験ということでソフトウェア開発企業に入社したんだけど、whileのところで早速詰まった('A`
0〜9 までの数字を、0 から1個ずつ増やしながら 10行表示しなさいっていうプログラムを作るんだけど、
0
01
012
0123
01234
012345・・・
とはならずに
0
1
2
3
4
ってなっちゃいます。というかそういう風に書いてるのもわかるんですが、
#include <stdio.h>
int main(void)
{
int a = 0;

a = 0;
while(a < 10)
{
printf("%d\n" ,a);
a++;
}

return 0;
}
↑whileの中をどうすればいいんでしょう・・・。

338:デフォルトの名無しさん
07/10/24 21:26:55
while(a < 10)
{
int b = 0;
while(b <= a)
{
printf("%d", b);
b++;
}
printf("\n");
}

339:デフォルトの名無しさん
07/10/24 21:29:01
#include <stdio.h>
int main(void)
{
int a,b;

for(a=0;a<10;a++)
{
for(b=0;b<=a;b++)printf("%d" ,b);
printf("\n");
}

return 0;
}

340:デフォルトの名無しさん
07/10/24 21:32:40
>>338
ああああありがとうございます!
whileの中にwhile使うとは盲点。
流れも理解できましたありがとうございます!

341:デフォルトの名無しさん
07/10/24 21:35:51
>>340 for文を使ったほうがベター

342:デフォルトの名無しさん
07/10/24 21:38:14
そこまで出来ないでよく仕事になるな 入って2週間以内とかか? それならいい

343:デフォルトの名無しさん
07/10/24 21:38:43
>>341
そうなんですよね。
他にもwhileを使って、2個入力した文字列が、同じ文字列かどうか判断するプログラムを作ったんですが、
ifelse使った方が手っ取り早かったり、一応基本中の基本ということで頑張ってますが、
とりあえずとことん覚えてみようと思います。

344:デフォルトの名無しさん
07/10/24 21:40:48
>>342
まだ3日目です('A`)('A`)('A`)
初日はOSインスコとかパソコンに関する事を教わって(というか何回もやってきた事なので余裕でした)
二日目は%dやらfloat=小数点やら、long=スゲーでかい数とか、配列とかを覚えて
本日三日目でif else for を覚えたんですが、whileがなんかスゴイ曲者というか、問題がクセものでてんてこ舞いです。。。

345:デフォルトの名無しさん
07/10/24 21:44:45
>>343
実戦力高めるならSTLだな
たとえば2つの文字列比較するならこうやればいい

#include <iostream>
#include<string>
using namespace std;

main(){
string a,b;
a="こんにちは"; b="こんばんわ";
cout<<a<<" と "<<b<<"は ";
if(a==b)cout<<"一致"; else cout<<"違う";
}

346:デフォルトの名無しさん
07/10/24 21:59:46
行列を計算するときにライブラリって使えるの?
固有値を求めたいんだけど。

347:デフォルトの名無しさん
07/10/24 22:09:40
>>345
初心者(それも++じゃなくてCっぽい)にそんなこと教えたら、
同じ文字列が入ったchar配列を==比較して「あれ? 同じのはずなのに……」てことになるぞ

348:デフォルトの名無しさん
07/10/24 22:16:49
>>346
標準ライブラリーにはない
特殊な科学技術計算用のライブラリーを手に入れるか、自作するか

349:デフォルトの名無しさん
07/10/25 08:26:44
>>346
clapack


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5172日前に更新/251 KB
担当:undef