C言語なら俺に聞け( ..
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
350:デフォルトの名無しさん
07/10/25 22:25:22
typedef struct{
int hoge;
int hage;
int hige;
int huge;
} HOGE;
と言う構造体があるとして、hoge = 1; hage = 0; hige = 1; huga = 1;となっているとします。
その構造体の中で、値が"1"になっている物を見付けたいのですが、そういうことはできないですか?
構造体内の変数の値を調べ、それが条件にあっていれば別々の処理をしたいです。
351:デフォルトの名無しさん
07/10/25 22:28:28
Cじゃムリ。
リフレクションのある言語ならできる。
352:デフォルトの名無しさん
07/10/25 22:39:37
意味がわからんぽ
メンバ名で参照したくないって事?
構造体先頭からのオフセットでアクセスするとかかな
353:デフォルトの名無しさん
07/10/25 22:50:11
>>350
配列にしない(できない)理由はあるの?
typedef union{
struct{
int hoge;
int hage;
int hige;
int huge;
}
int array[4];
} HOGE;
354:350
07/10/25 22:57:44
>>353
なんですかそれは…
始めてみました。 意味がちょっとわかりません…
その形にしておいて、
HOGE u_hoge;
....
u_hoge.array[0]にしたら、hogeにアクセスできるって事ですかね?
355:デフォルトの名無しさん
07/10/25 22:58:37
共用体でググってくるんだ!
356:デフォルトの名無しさん
07/10/25 23:55:24
だんだんと解ってくると、プログラム書くのが面白くなってくるなぁと思った超初心者な俺。
357:デフォルトの名無しさん
07/10/26 00:26:59
fgetsで入力した後'\n'を消す方法はありますか?
あまりポインタは使いたくないんですが・・・
358:aho
07/10/26 00:29:26
>>350
構造体のポインタを利用してみました。
#include <stdio.h>
typedef struct{
int hoge;
int hage;
int hige;
int huge;
}HOGE;
int main(){
HOGE* hogep = NULL;
try{
hogep = new HOGE();
}catch(...){
printf("new error!\n");
}
/* メンバ変数の初期化 */
hogep->hoge = 1;
hogep->hage = 0;
hogep->hige = 1;
hogep->huge = 1;
printf("%d\n", hogep->hoge);
return 0;
}
359:デフォルトの名無しさん
07/10/26 00:40:51
>>357
fgets(buf, n, fp);
if (buf[strlen(buf) - 1] == '\n') {
buf[strlen(buf) - 1] = '\0';
}
・・・?
360:デフォルトの名無しさん
07/10/26 00:44:21
>>357
fgets(buff, sizeof buff, stdin);
for(i=0; buff[i]; i++) if(buff[i]=='\n') { buff[i] = '\0'; break;}
361:デフォルトの名無しさん
07/10/26 01:39:24
C++Compiler / Turbo Debugger をzipから解凍したらフォルダに何も入ってなかったんだけど・・・
どこでパス入力するの?
362:教えてください
07/10/26 03:23:34
C言語についての質問です。
下記の素数か素数でないか調べるコードで、
@変数名にis_primeとありますが、isは何を意味しているのですか?
Ais_prime = 1;とするのがわかりません。
B以下、return 0; まで、どういう流れかわかりません
よろしければ1行ずつ教えてもらえるとうれしいです。
#include <stdio.h>
int main(void)
{
int num, i, is_prime;
printf("判定したい数を入力してください: ");
scanf("%d", &num);
/* 約数があるかどうか調べる */
is_prime = 1;
for(i=2; i<=num/2; i=i+1)
if((num%i)==0) is_prime = 0;
if(is_prime==1 && num > 1) printf("素数です");
else if (num > 1) printf("素数ではありません");
return 0;
}
363:デフォルトの名無しさん
07/10/26 03:44:59
num is_prime なんだろ
364:デフォルトの名無しさん
07/10/26 08:08:18
>>362
適当な数字入れて処理追いかけてみろよ。
365:デフォルトの名無しさん
07/10/26 08:13:38
なんにもわかってないってことかよw
366:デフォルトの名無しさん
07/10/26 11:02:57
>>362
You is fool.
367:デフォルトの名無しさん
07/10/26 11:26:14
>>361
解凍しなおしてみたら?
368:デフォルトの名無しさん
07/10/26 12:54:26
You are Shock!
369:デフォルトの名無しさん
07/10/26 13:24:17
atofとか解読できなさそうだな
370:デフォルトの名無しさん
07/10/26 13:55:39
数値計算において
不等号の>>と>の判別ってプログラム的にどうすべきですかね?
計算は対数でするんだけど。
371:デフォルトの名無しさん
07/10/26 14:35:43
差が閾値を越えるかどうかで判定
もしくは比が閾値を越えるかで判定
372:デフォルトの名無しさん
07/10/26 15:09:54
その問題では>>と>=で計算方法違うんだよ。
今計算してみると対数の値をexpかけてみて値をみていくと
値がかわってくるのが差が10から15あたりのときみたいだから
閾値を15で計算をかえてみることにするわ。
373:デフォルトの名無しさん
07/10/26 15:49:02
for(;loc<100;loc++){
if(loc<100){
printf("氏名を入力して下さい(空白で終了):\n");
fgets(data[loc].namae,39,stdin);←この行
if(!*data[loc].namae)break;
printf("電話番号を入力して下さい:\n");
fgets(data[loc].denwa,39,stdin);
printf("市外局番を入力して下さい:\n");
fgets(str,9,stdin);
data[loc].sigai=atoi(str);
}
}
上の行のfgetsをgetsに変えるとEnterでbreakするんですけど
fgetsのままでは動作しません。どうすればfgetsのままで動作しますか?
374:デフォルトの名無しさん
07/10/26 16:10:04
>>367
何回解凍しなおしてもダウンロードしなおしても空…
zipファイルはちゃんと容量あるのに解答してできたフォルダには容量が全くなくなる。
375:デフォルトの名無しさん
07/10/26 16:15:36
>>374
解凍ソフトは何?
パス付きに対応してないやつなんじゃね?
376:デフォルトの名無しさん
07/10/26 16:17:32
>>373
fgetsは改行も取り込むから、
fgets(data[loc].namae,39,stdin);
if(data[loc].name[0] == '\n') break;
これでおk
377:デフォルトの名無しさん
07/10/26 16:26:35
>>376
出来ました。ありがとうございます。
378:デフォルトの名無しさん
07/10/26 16:30:47
fgetsの解説ですが
URLリンク(ohmoriws1.ms.kagu.tus.ac.jp)
ここは間違ってる?もしくは誤解される様な感じなのですか・・?
一度参考にしたんですが・・。
379:デフォルトの名無しさん
07/10/26 16:46:34
>>378
'\n'を取り除くとも書いてないから間違いとは言えない。
しかし、その直後のfputs()の説明が間違っているから信用できない。
380:デフォルトの名無しさん
07/10/26 17:20:43
すいません超絶初心者な僕に教えて頂きたいことがあるます
1行64バイトのファイル(行数可変)のデータに何回も文字列の検索を行ういアウトプットするプログラムを作っています。
fgetsを使い何回もファイルを読み込んで一行ずつ比較するというようにできたにはできたのですが、
行数可変で多い場合100000行超えたりするファイルに対してはえらい時間がかかります。
メモリにぶちこんでそこから何回も検索を行いたいと思うのですが、どう組んだらいいでしょうか。
381:これ参考に
07/10/26 17:37:47
#include <stdio.h>
#include <time.h>
#include <string.h>
int N;
void serch(char* x,char* str,int* adr){
char t[256];int n,M,k,su=0;
for(M=0;;M++)if(str[M]=='\0')break;
for(n=0;n<256;n++)t[n]=M;
for(n=1;n<=M;n++){k=(unsigned char)str[M-n];if(t[k]==M)t[k]=n;}
n=0;while(1){
for(k=0;k<M;k++)if(str[k]!=x[n+k]) break;
if(k==M){adr[su]=n;su++;n+=M;}
else {k=(unsigned char)x[n+M];n+=t[k];}
if(n+M>=N){adr[su]=-1;return;}}}
main(){
N=18000000;char *x=new char[N];N=0;
char buf[120],k,n;
FILE *fp=fopen("2ch.txt","rb");
while(k=fread( buf,1,100,fp)){
for(n=0;n<k;n++)x[N+n]=buf[n];N+=k;}
fclose(fp);
printf("データロード完了!\n測定中です・・・\n");
int adr[30000];
char str[]="名無し";
serch(x,str,adr);
}
382:デフォルトの名無しさん
07/10/26 18:07:20
>>381
変数の使い方、変数の名前が気持ち悪い
>>380
malloc,realloc使うべし
383:デフォルトの名無しさん
07/10/26 18:08:40
あ、いや、バイナリならftellとfseekでサイズが分かるから、
reallocはいらないやも
384:デフォルトの名無しさん
07/10/26 18:24:22
>>381さん
ありがとうございます
>>382さん
mallocを使った場合どのように組めばいいでしょうか?
385:デフォルトの名無しさん
07/10/26 18:35:14
一番簡単な方法おしえてやる
386:デフォルトの名無しさん
07/10/26 18:36:04
>>375
ありがとう。
解凍ソフト変えたらできた。
387:デフォルトの名無しさん
07/10/26 18:53:06
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
fstream fp("test.txt");
string str,buf;
do{
fp >> buf;
str+=buf;
}while((!fp.eof()));
int n=str.find("会議");
cout << n;
}
388:デフォルトの名無しさん
07/10/26 18:53:49
>>381
だからその入力ロジックを何とかしろって
389:デフォルトの名無しさん
07/10/26 19:06:04
>>384
適当に書いた例だけど
FILE *fp;
char *data;
... //省略
data = (char*)malloc(sizeof(char) * 128); /とりあえずchar128個分確保
if(data==NULL) return 1; //エラー処理
int i=0,size=128;
while((data[i] = getchar()) != EOF){
if(++i >= size){
char *tmp;
tmp = realloc(data,sizeof(char) * (size + 50)); //50ずつ拡張
if(tmp == NULL){
/* reallocは元の領域を解放するが、失敗時は解放せずにNULLを返す
そのため、失敗時に解放できるように、別変数で一度戻り値を受けてから、エラーチェックする */
free(data); //mallocやreallocで確保した領域は必ず解放する
return 1;
} else {
data = tmp;
size += 50;
}
}
}
free(data) //必ず解放
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5158日前に更新/251 KB
担当:undef