C言語なら俺に聞け( ..
[2ch|▼Menu]
446:441
08/04/18 00:58:28
>>442
スレ違いで、失礼いたしました。
このような質問は、どのスレッドで聞くべきなんでしょうか? 
すみませんが、教えてください。

447:デフォルトの名無しさん
08/04/18 00:59:31
>>446
どうぞどうぞ

448:デフォルトの名無しさん
08/04/18 01:00:04
>>445
あっ どうぞ、どうぞw

449:448
08/04/18 01:01:50
33秒差で負けた・・・

450:デフォルトの名無しさん
08/04/18 01:03:10
>>447-449
早漏乙

451:デフォルトの名無しさん
08/04/18 01:27:18
>>446
BCC Developper
スレリンク(tech板)

ここで聞くのがいいんだろうけど、問題はとんでもない過疎スレで、
質問してもレスがつくという保障はない。

とりあえず、ここでいいんじゃないの?

452:デフォルトの名無しさん
08/04/18 09:36:52
>>441
>何がいけないんでしょうか?
あんたの頭。

453:デフォルトの名無しさん
08/04/18 13:53:50
シンボリックな定数を扱う場合、
大きくわけて#defineを使うのとenumを使うのがあるようですが、
どのように使い分ければいいのでしょうか?
それとも好みの問題?

454:デフォルトの名無しさん
08/04/18 14:03:01
複数の定数にまとまった意味があるならenum、
整数値でないならdefine、
後はプロジェクトごとの規定による。

455:デフォルトの名無しさん
08/04/18 14:26:08
来週から新人研修でC言語担当になったので来てみました。
最初からじっくり読んでエスパー目指します。

456:デフォルトの名無しさん
08/04/18 16:30:54
>sprintf("%0.2f", 1.1)
って書き方は間違いですか?

直すとしたら、
>sprintf("%.2f", 1.1)
といった感じでしょうか?


457:デフォルトの名無しさん
08/04/18 16:33:33
>>456
直すとしたら
sprintf(buffer, "%0.2f", 1.1);
じゃないかと思った

ゼロフラグが有っても別に間違いということはないと思う

458:456
08/04/18 16:37:44
了解。どうも有難う。

459:nito
08/04/18 16:39:40
vs2005で
featall[i*featnum[i]+p].descr = n[p].descr;
とすると
main.c(143) : error C2106: '=' : 左のオペランドが、左辺値になっていません。
というエラーがでます。
どうしてでしょうか。
ちなみにdescrは[128]です。

460:デフォルトの名無しさん
08/04/18 16:51:23
>>459
int a[10]; で
a = 5; とかできない。
ってのと同じ。

461:デフォルトの名無しさん
08/04/18 16:56:51
そのエラーメッセージもおかしくて、正確には「変更可能な左辺値」だけどな…
配列をまるっとコピーしたいならmemcpyかmemmoveを使え

462:デフォルトの名無しさん
08/04/18 17:05:17
>>461
おかしいといえばおかしいが、おかしくないといえばおかしくない。
なぜなら配列は特定の場合を除いてポインタ値(ポインタ変数ではない。つまり右辺値)に成り下がるから。
まあどうでもいいか。

463:nito
08/04/18 17:24:42
>460
言われてみれば確かに…

>461
おkす。やってみます。

みなさんありがとうございます。
何分Cは初めたばかりでしてちょくちょくつっかかってまして
また使わせていただきます(滝汗

464:nito
08/04/18 18:07:26
続きになるんですが
memcpy(featall[i*featnum[i]+p].descr,n[p].descr,sizeof());
と書くことにしました。
この場合、sizeofには
int[128]
と入れれば
128個の配列分確保されるんでしょうか。

465:デフォルトの名無しさん
08/04/18 18:25:29
>>464
yes

466:465
08/04/18 18:33:49
老婆心ながら
memcpy は移動元と異動先が被るような場合はうまくいかない。
bcopy (from, to, len); // memcpy(to, from, len) と引数順が違う
というのもある。

467:デフォルトの名無しさん
08/04/18 19:29:52
printf( "%c" , 'A' );
が標準出力に文字「A」を出すという保証はないですよね?
「文字定数=>int」「int=>char」「char=>%cで出てくる文字」は全く別の変換であって、
そこらの処理系ではたまたま合ってるだけですよね
規格を読む限り

468:デフォルトの名無しさん
08/04/18 20:02:49
>>466
何故そこでmemmove()を薦めない。

469:デフォルトの名無しさん
08/04/18 20:36:25
>>466
bcopy は sun os に付属のコンパイラで使ったことがありますが、どこにでもあるのでしょうか....。
やっぱり memmove() ですか。

470:デフォルトの名無しさん
08/04/18 20:51:50
入力された値が3だったら、
***
-**
--*
といった具合(後ろで桁合わせ、-は空白)に出力されるプログラムを組みたいと思います。
#include <stdio.h>
int main(void)
{
int num,i,j,k;
scanf("%d",&num);
for(i=1; i<=num; i++)
{
for(j=num; 0<j; j--)
{
printf("*");
}
printf("\n");
for(k=1; k<=i; k++)
{
printf(" ");
}
}
return 0;
}
の様に組んだのですが、実行すると
***
-***
--***
となってしまいます。
*を出力する部分がうまく動いていないのだと思い、色々いじくってみたのですが、
3,2で終わってしまったり、無限ループしてしまうといった状態でどう改善させれば良いのか分かりません。
宜しくお願い致します。

471:デフォルトの名無しさん
08/04/18 20:58:09
-for(j=num; 0<j; j--)
+for(j=num; i<=j; j--)


472:デフォルトの名無しさん
08/04/18 21:10:45
#include <stdio.h>
int main()
{
int num;
scanf("%d", & num);
for (i = 0; i < num; ++i) {
printf("%*s%.*s\n", i, "", num - i, "**********");
}
return 0;
}

473:デフォルトの名無しさん
08/04/18 22:37:09
>>471,>>472
実はこれに2時間以上つっかかってました・・・(恥
これで安心して寝れます。ありがとうございました。

474:デフォルトの名無しさん
08/04/18 22:38:54
空白のループは*のループの前に持ってきたほうがいい

475:472
08/04/18 23:11:15
>>473
感謝するなら理解してからにしてくれ。

476:デフォルトの名無しさん
08/04/19 02:01:40
case3以降の計算が滅茶苦茶になるんですが

#include<stdio.h>
void main()
{
int person;/*宿泊者の人数*/
int price; /*1人あたりの宿泊費*/
int room; /*1部屋あたりの宿泊費*/

person=3;

switch(person)
{
case1:/*1人の時*/
price=18000;
break;
case2:/*2人の時*/
price=10000
break;


477:デフォルトの名無しさん
08/04/19 02:07:39
476のつづき

case3:/*3人の時*/
price=8000
break;
  }
room=price*person;/*1部屋あたりの宿泊料を計算*/

printf("宿泊人数%d人の時、",person);
printf("1人あたりの宿泊料は%d円です。\n",price);
printf("1部屋あたりの宿泊料は%dです。\n",room);
}
  

478:デフォルトの名無しさん
08/04/19 02:07:53
続きは?
あと
× void main() { ... }
○ int main() { ... return 0; }

479:デフォルトの名無しさん
08/04/19 02:09:18
すれ違ってしまった・・・。

以降ってことは 4 とか入れた場合のことか?
そりゃ price に何も値代入してないから無茶苦茶になるぜ。

480:デフォルトの名無しさん
08/04/19 02:10:45
コンパイルするとcase3以降の計算が間違ってしまいます。

それでcase2までにすると、どんな値をいれても正確に計算されるんですが
3つ以上になるとおかしくなるんです。

481:デフォルトの名無しさん
08/04/19 02:14:15
>>478、479
ありがとうございます。
明日、起きたら試してみます。
いま使っているパソコンとプログラミングしているパソコンは
別にあるので夜遅く申し訳ありません。

482:デフォルトの名無しさん
08/04/19 02:16:17
case と数値の間にスペースがないのはコピペミスか?

483:デフォルトの名無しさん
08/04/19 02:16:37
>467
どう読んだか知りませんが、間違ってます。

484:デフォルトの名無しさん
08/04/19 07:57:59
>>481
>482が指摘したとおり、caseの後に空白がないのではないか?
他の構文ミスと違い、caseの後の空白がないこと自体は文法違反にならないからエラーにはならない。

485:デフォルトの名無しさん
08/04/19 10:28:29
ただのラベルになっちゃうからねぇ

486:デフォルトの名無しさん
08/04/19 10:31:35
default:
 if (person == 3) goto case3;

487:デフォルトの名無しさん
08/04/19 12:24:23
学習教材として、「猫でもわかるC言語プログラミング」か
「十日で覚えるC言語入門教室」のどちらを買おうか悩んでいるんですが、
経験者の方から見てどちらが使いやすいんでしょうか?」
アマゾンはいまいち頼りにならなくて・・・・

488:デフォルトの名無しさん
08/04/19 12:39:11
エラトステネスの篩をCで書いているんですが、
以下のプログラムをコンパイルして実行しても、数字を入力させるだけで何も起こりません。
prime[ ]が変であるのはわかるんですがどう直せばいいかわからなくて…
ご教授よろしくお願いします。

#include <stdio.h>
int main(void)
{
int i,j,num,prime[10000+1];
printf("Please input the number : ");
scanf("%d",&num);
for(i=2;i<=num;i++){
prime[0]=prime[1]=0;
prime[i]=1;
}
for(i=0;i<=num;i++){
if(prime[i]){
for(j=2;(j*i)<=num;j++)
prime[j*i]=0;
}
}
for(i=0;i<=num;i++){
if (prime[i]){
printf("%d",i);
}
}
printf("\n");
return 0;
}

489:デフォルトの名無しさん
08/04/19 12:43:41
476ですが、
>>478
>>479
>>484
>>486さんのいう通り試してみましたが、case3以降の計算がやはり間違えてしまいます。

もう一度、プログラムを書きなおしてみても同じ結果でした。
コンパイルになにか不具合があるのでは?と疑っています。

とりあえずcase2までは計算できるので、エラーは置いといて先のプログラムに進んでみよう
と思います。


490:デフォルトの名無しさん
08/04/19 12:50:55
>エラーは置いといて先のプログラムに進んでみようと思います。
やめろバカ
一足飛びに習得できるほどCはヌルい言語じゃないぞ

とりあえずコンパイルしたソースをそのまま貼るんだ

491:デフォルトの名無しさん
08/04/19 12:55:30
>>488
・ prime[0]=prime[1]=0; はループの外に出せ
・ 二つ目のループが何をやっているのかもう一度考えなおせ
 ifに条件が足りないはず

492:デフォルトの名無しさん
08/04/19 13:14:29
>>476>>477のプログラムをコンパイルすると
person=3なので、>>477のcase3の値がテキスト上では計算されることになってます。

実際のコンパイルの結果は

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

宿泊人数3人の時

1人あたりの宿泊料は 2147348480 円です

1部屋あたりの宿泊料は 2147078144 円です

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

となります。(21億4千7百34万8千480円)と(21億4千7百7万8千144円)



493:デフォルトの名無しさん
08/04/19 13:18:13
>>492
>person=3なので、>>477のcase3の値がテキスト上では計算されることになってます。
いいえ。理由は>484。

494:488
08/04/19 13:19:21
>>491
言う通りにしたら正常に動作しました。ありがとうございました。

あと、このプログラムだと入力値が10000をこえると正しく動かないと思うんですが、
入力値までprimeを定義するにはどうすればいいんでしょう?

495:デフォルトの名無しさん
08/04/19 13:20:44
primeをmallocで確保

496:デフォルトの名無しさん
08/04/19 13:26:31
>>493

書いたプログラムを確かめたところ、ご指摘のとおり
case 3: と空白を開ければ、指示通り正しい計算ができました。

初歩的なミスでお騒がせしてすいませんでした。
またよろしくお願いします。



497:デフォルトの名無しさん
08/04/19 14:20:41
ファイル中に1行ずつ下記の様なデータが入っているとします。
1行に含まれるデータの数は各行でまちまちです。

element1 element2 element3 ・・・ elementL
element1 element2 element3 ・・・ elmenetM
   ・
   ・
element1 element2 element3 ・・・ elementN

このときに各elementを1つずつ、読み込むにはどの様にすればよいでしょうか?
現在、下記の様に変数を多めに取って解決しているのですが、もっとよいやり方
はありますでしょうか?

while(fgets(buf, sizeof(buf), fp)!=NULL){
scan_num = sscanf(buf, "%s %s %s %s %s", element1, element2, element3, element4, element5);
}



498:デフォルトの名無しさん
08/04/19 14:43:41
つfscanf

499:497
08/04/19 14:57:05
>498
レスありがとうございます。一つ書き忘れたのですが、行を行として読み込むことが
要件としてあります。つまり、1行と2行目は別の要素として読み込みたいと考えてます。
要件漏れすいませんでした。

fscanfは考えたのですが、改行文字も空白と同様データの区切りとして読み込むと
のことでしたので、1行をバッファに読み込んでから処理をしています。1行ずつ別途に
処理する方法があれば教えてください。


500:デフォルトの名無しさん
08/04/19 15:31:22
>>499
fgets(), sscanf()

501:デフォルトの名無しさん
08/04/19 15:37:44
fgetcで改行まで読む

502:デフォルトの名無しさん
08/04/19 15:46:07
関数へのポインタの定義で”型名 (*ポインタ変数)(引数)”とするところを
”型名 *ポインタ変数(引数)”と、するとどうしてダメなのでしょう?
お願いします。


503:デフォルトの名無しさん
08/04/19 15:49:11
int *kansu() は int型のポインタを返す関数と解釈される

504:デフォルトの名無しさん
08/04/19 15:56:26
>>503
よく分からないのですが、int *kansu()はint形のポインタを返す関数の
プロトタイプ宣言と解釈されるのですか?

505:デフォルトの名無しさん
08/04/19 16:01:46
そういうこと
int* p;
p = kansu();

506:デフォルトの名無しさん
08/04/19 16:06:59
>>503
ありがとございました。

507:デフォルトの名無しさん
08/04/19 16:08:55
typedef int kansu_t(void);
kansu_t* kansu = &foo;
int n = kansu();

typedef は偉大だと本気で思う。

508:デフォルトの名無しさん
08/04/19 17:30:27
C言語勉強中の者です。
データ管理のプログラムを作る時、各々のデータ(文字列)の配列のサイズは、
malloc()関数で決めるのが一般的なのでしょうか?


509:デフォルトの名無しさん
08/04/19 17:32:18
可変長の場合はね。
mallocのほか、calloc()やrealloc()でも可。

510:デフォルトの名無しさん
08/04/19 17:38:25
最初のうちは、#defineで最大サイズを容易に変更できるようにした固定長配列でもいいと思うけどな。
いずれにしろ、ある程度の規模になればmalloc()は必須になるから慣れておいたほうがいい。

511:デフォルトの名無しさん
08/04/19 17:43:25
free 忘れは大変だしな。

512:デフォルトの名無しさん
08/04/19 17:52:55
>>509,510,511

ありがとうございます。
「ある程度の規模」というのがわからないのですが、
たとえば、500個くらいのデータの各々に「メモ」配列をつける場合、
200文字までと固定してしまって、実際にはメモのない場合がほとんどだったら?



513:デフォルトの名無しさん
08/04/19 17:53:58
長さを固定にしたくなければ動的に確保すればいいし、
固定で十分なら固定にすればいい。

514:デフォルトの名無しさん
08/04/19 17:54:40
初心者はstring

515:デフォルトの名無しさん
08/04/19 17:54:59
C スレで何言ってんの?

516:デフォルトの名無しさん
08/04/19 17:57:25
mallocやfreeは上級者しか無理 stringをかなり進める

517:デフォルトの名無しさん
08/04/19 18:01:37
>>512
「スタック」でぐぐってみるとよし。
スタックは小さいから、そこに収まらない規模の配列は必然的にmalloc()を使うことになる。

518:デフォルトの名無しさん
08/04/19 18:03:44
C≠C++

519:512
08/04/19 18:09:29
みなさん、ありがとうございます。
さしあたって、Cを勉強しているのですが、
stringが簡単そうですね。
C++も視野に入れて勉強していこうと思います。


520:デフォルトの名無しさん
08/04/19 18:13:37
string a="あいう";

a=a+"えお";

などと自動でサイズ変更してくれる。
初心者はstring

521:デフォルトの名無しさん
08/04/19 18:19:10
a=a+"えお"; とか書くなよ・・・。
a+="えお"; だろ。
コスト考えれ。

522:デフォルトの名無しさん
08/04/19 18:24:08
後ろに空きがあったら、メモリを解放せずに増やす方法ありますか? 普通に牌列としてアクセスできてです。

523:デフォルトの名無しさん
08/04/19 19:37:51
realloc

524:デフォルトの名無しさん
08/04/19 19:53:31
「キーボードより英大文字(A-Z)の文字列を変数cに入力し、それぞれの字種の出現頻度を表示するプログラムを作成せよ。
最初に配列の要素を0で初期化し、英大文字の入力はctrl+zにより終了するようにせよ。
ただし、英大文字以外が入力されたら、その文字数を変数othersでカウントして表示する事。」
という問題について考えていますが、今ここまで出来ました。

#include <stdio.h>
int main(void)
{
int other,i,a[26]; /*変数other、制御用変数i、配列a[26]を宣言*/
for(i=0;i<26;i++)
a[i]=0; /*forループで配列aの全要素初期化*/
puts("Input A-Z, end:ctrl+z");
while((i=getchar())!=EOF)
if

ここから、字種の出現頻度を求めるために一体どうすればいいのか分かりません…。
何かヒントを頂けないでしょうか。

525:デフォルトの名無しさん
08/04/19 20:01:06
A-Zの出現個数をカウントする変数(たぶん配列になるね)を作成する。
文字に応じて対応したカウンタをインクリメントしていき、終了時に頻度を出力。

526:デフォルトの名無しさん
08/04/19 20:01:08
宿題スレで聞けば

527:デフォルトの名無しさん
08/04/19 20:13:04
うおおおおおお
やっとCの入門書を読み終えたのだが、
フリーソフトとかで転がってるウィンドウズのプログラムとか
まだぜーんぜん無理な気がする。
だいたいそもそウィンドウの一文字も出てこないんだが、、、
コマンドプロンプトでさ、計算とかさ、文字列とかさ、
先がながーーーーーーーーーーーーい

みなさんいっぱしのプログラムが作れるようになるまで
どんくらいかかりました・・・?

528:デフォルトの名無しさん
08/04/19 20:21:44
>>527
読むだけじゃダメなんだぜ?
理解し実践して身に付けなければ次へ進むことはできない。

529:デフォルトの名無しさん
08/04/19 20:22:53
9歳ぐらいからコード書き始めて
初めてリリースしたのが14歳でvimのパッチ。
自分のオリジナルソースは某3Dライブラリで19の時。
お遊びで始めたsocket通信利用のP2P対戦ゲームを作成したのが20の時。
採用された企業で売れる商品に携われたのが23歳の時。

14年ぐらいかな

530:デフォルトの名無しさん
08/04/19 20:26:20
経験歴と実力は関係ない 駄目なやつは20年でも無理

531:デフォルトの名無しさん
08/04/19 20:32:22
>>529
特定しました

532:デフォルトの名無しさん
08/04/19 21:16:05
sscanfの %n 指定子を使って文字数を取得したいのですが、意図し
たとおりの動作しません。良い方法が有れば教えてください。出来
ればstrlenは使いたくない。他におかしいところが有ったら教えて
貰えるとありがたい。
======
const char *str_src = "a\nab\nabc\nabcd";

res = sscanf(str_src, "%s%n%s%n%s%n%s%n%s%n",
str_dst[0], &n[0], str_dst[1], &n[1],
str_dst[2], &n[2], str_dst[3], &n[3],
str_dst[4], &n[4]);

for (i = 0; i < res; i++) {
printf("(%2d): %s\n", n[i], str_dst[i]);
}
======

結果(意図する結果は1,2,3,4)
======
( 1): a
( 4): ab
( 8): abc
(13): abcd
======

533:デフォルトの名無しさん
08/04/19 21:18:21
%n は先頭からの位置であって、
前回読み出した位置からの相対位置を取得するものではない。

534:側近中の側近 ◆0351148456
08/04/19 21:22:03
>>532
(っ´▽`)っ
%nは、sscanf関数の呼出しでこれまでに読み取った文字数を、その整数に書き込む。
つまり、
a・・・1文字
a\nab・・・4文字
a\nab\nabc・・・8文字
a\nab\nabc\nabcd・・・13文字
ということになる。

535:532
08/04/19 21:28:43
>533 >534

早速の回答ありがとうございます。
どうさ結果からしてそうらしいとは思っていました。残念。
strlen呼ぶしか無いのかなぁ

536:デフォルトの名無しさん
08/04/19 21:37:30
scanf は空白読み飛ばしたりするし、
%n だけじゃ難しいね。
strlen の方が簡単だと思う。

537:デフォルトの名無しさん
08/04/19 22:11:47
strlenを使いたくない理由は?

538:532
08/04/19 22:15:32
>537
改めて突っ込まれると特に理由は有りません(汗)
強いて言うならあまり美しくないと思ったくらい。

539:デフォルトの名無しさん
08/04/19 22:44:39
>>532
ptr=str_src;
for(i=0;i<5;i++){
sscanf(ptr, "%s%n", str_dst[i], &tmp);
n[i]=strlen(str_dst[i];
ptr+=tmp;
}

540:デフォルトの名無しさん
08/04/19 23:44:51
>>524

if(isupper(i))
a[i-'A']++;
else
other++;


541:デフォルトの名無しさん
08/04/19 23:51:09
('A')

542:デフォルトの名無しさん
08/04/20 00:50:12
while ('A') { ... }

543:デフォルトの名無しさん
08/04/20 01:20:11
>>507
>>507
int n = (*kansu)();
でないと、偉大さがあいまいになる気がします‥‥‥。

544:デフォルトの名無しさん
08/04/20 13:57:17
テキストファイルから、特定の文字列に挟まれている文字列を抽出して、
一覧表示するプログラムを作りたいのですが、
何かヒントをください!!


545:デフォルトの名無しさん
08/04/20 13:59:50
>>544
strstrを使う

546:デフォルトの名無しさん
08/04/20 14:30:22
あとは strncpy

547:デフォルトの名無しさん
08/04/20 14:33:57
popen("grep 'keyWord.*keyWord' fileName", "r")
# 寧ろsedか

548:デフォルトの名無しさん
08/04/20 21:06:28
DXライブラリを使ったゲーム作成に入りたいです
現在、BorlandC++ Compiler 5.5(コンパイラ)とCPad(エディタ)の組み合わせで使っていますが
この環境でのDXライブラリを使う方法がいまいちわかりません
DXライブラリの公式サイトではBCC Developerというエディタで説明を進めているのですが、CPadでは使えないのでしょうか?

549:デフォルトの名無しさん
08/04/20 21:19:38
使える

550:デフォルトの名無しさん
08/04/20 21:26:08
>>549
そうですか!
しかし使い方がわかりません
どこを設定すればいいでしょうか?


551:デフォルトの名無しさん
08/04/20 21:36:12
Cpadで書いてBCC Developerでコンパイルすればいいだけ

552:548
08/04/20 21:59:01
>>551
そのまま使える方法はないですかね?

553:デフォルトの名無しさん
08/04/20 22:00:52
質問の意味が分からない

554:デフォルトの名無しさん
08/04/20 22:02:41
ある値が出るまでずっと同じ動作を繰り返して、
ある値が出たら終了するようにするには、どうやるべきでしょうか?

555:デフォルトの名無しさん
08/04/20 22:04:48
>>554
do{x=動作;}while(x==ある値);

556:548
08/04/20 22:05:04
>>553
中のファイルをどこに置けばインクルードされるのかがわからないんです・・・

557:554
08/04/20 22:07:37
>>555
do whileの存在を忘れてました!試してみます
ありがとうございました!

558:デフォルトの名無しさん
08/04/20 22:09:25
>>555
do{x=動作;}while(x!=ある値);
だな

559:デフォルトの名無しさん
08/04/20 22:10:59
>>556
コンパイラから見える場所において置けよ

560:デフォルトの名無しさん
08/04/20 22:11:35
>>556
よく分からん
BorlandC++ Compiler 5.5のスレかDXライブラリのスレいったほうがいい

561:デフォルトの名無しさん
08/04/20 22:13:06
>>548
bcc32.cfg
ilink32.cfg
の中身を見てみることを勧める?

562:デフォルトの名無しさん
08/04/20 22:19:33
>>561
なんで疑問系?>オレ

563:548
08/04/20 22:26:56
>>559
.hや.libのフォルダが複数あってわかりません。。

>>561
パス追加するとインクルードはできてるようなのですがエラーも大量に出てきました。。


564:デフォルトの名無しさん
08/04/21 11:41:20
文字列を#defineで通し番号を付けて
#define test1 "hogeA"
#define test2 "hogeB"
...
#define test10 "hogeJ"
と定義した場合、Nを変数としてtestNを呼び出すにはどうすれば良いでしょうか。
イメージとしては配列の場合のtest[N]のようにです。

565:デフォルトの名無しさん
08/04/21 12:12:54
C言語でシリアル通信するとき、

プログラムではどういう設定をしたらいいんでしょうか?

566:デフォルトの名無しさん
08/04/21 12:31:23
>>565
OSの資料を読みましょう。

567:デフォルトの名無しさん
08/04/21 12:57:15
const char*の配列にすればお望みの事ができるよ。

const char* test[] = { "hogeA", "hogeB", ... };

568:564
08/04/21 13:07:25
>>567
完璧に思った通り動きました!!
的確な回答有難うございます。感謝します。

569:デフォルトの名無しさん
08/04/21 14:53:45
memmove(&feattest[0],&featall[0], struct feature);
とするとコピーがなされません。どうしてでしょうか。

なお、
struct feature* featall;
struct feature* feattest;
struct feature
{

double x;
double y;
double a;
double b;
double c;
}
としています。


570:デフォルトの名無しさん
08/04/21 15:02:40
>>569
featall, feattest が指す先はどこ?

571:デフォルトの名無しさん
08/04/21 15:04:04
セミコロン書き忘れてるみたいだし、sizeofも単なる書き忘れ?

572:デフォルトの名無しさん
08/04/21 15:08:32
>>569
どうでもいいけど、構造体のコピーなら=を使えよ。

573:デフォルトの名無しさん
08/04/21 17:40:46
構造体の多重間接参照が出来なくて困っています・・・。
struct set{
bool range;
int x;
int y;
bool ans;
};
main(){
struct set setA[5];
struct set setB[5];
(計算略)
ans=Judg(A,B);
}
bool Judg(struct set *setA,struct set *setB){
if((setA+((setB+i)->range))->range==true){/*問題発生っぽい箇所*/
return true;
}
return false;
}
みたいな感じなのですが、
(setA+((setB+i)->range))->range==true
って参照する事は出来ないんですか??

574:573
08/04/21 17:43:42
すみません bool ansの位置が間違っていました。。
main関数内で宣言しています。

575:デフォルトの名無しさん
08/04/21 17:46:16
setA[setB[i].range].range==true
こういうことをしたいのか?

576:デフォルトの名無しさん
08/04/21 17:47:30
そもそもiはどこから出てきたんだろう

577:デフォルトの名無しさん
08/04/21 17:48:22
>>573
コンパイルエラーならエラーメッセージを貼るべし

578:573
08/04/21 17:52:47
>>575
そういう事をしたいです。

>>576
実際はforループの中に入ってるんですが、
プログラムがゴッチャゴチャになっているのでかなり抜粋しています。
多重間接参照の方法が知りたいと思いまして…

>>577
コンパイルは通ります。でも値が上手く入っていないようで常に0を返してきます。。
多重間接参照の部分は合っていますか?変に回りくどく聞いて申し訳ございません。。

579:デフォルトの名無しさん
08/04/21 18:01:07
とりあえずmainの中でsetA[0].rangeとsetA[1].rangeの値を確認してみるべきだと思う

580:デフォルトの名無しさん
08/04/21 18:14:54
(setA+bool型)だけどそういうプログラムなのかな?

581:573
08/04/21 18:27:07
>>579
表示させてみた所、値がおかしいです。・・・常にfalse。。

>>580
はい。そこも伝わりづらくすみません。

質問投げっぱなしで申し訳ないのですが、
>>579さんの感じでやってみた所、原因は(計算略)の部分にありそうです。
ここに数百行詰まっていて助けを借りるのも憚られるので、自力でなんとかしてみます。
気にかけて頂きありがとうございました。。

582:デフォルトの名無しさん
08/04/21 18:55:44
プロトタイプ宣言についての質問です。

/* 1つめのソース */
void init(int *a, int **p);   // ここに書く
int main() {
  int a = 0, *p = NULL;
  init(&a, &p);
  printf("%d\n", *p);
  return 0;
}
void init(int *a, int **p) {
  *p = a;
}

/* 2つめのソース */
int main() {
  void init(int *a, int **p);   // ここに書く
  int a = 0, *p = NULL;
  init(&a, &p);
  printf("%d\n", *p);
  return 0;
}
void init(int *a, int **p) {
  *p = a;
}

この2つはどちらも実行可能なのですが、どのように違うのでしょうか。
プロトタイプ宣言にローカルとかグローバルとかあるものなんでしょうか。
ちなみにコンパイラはgcc4.1.1です。

583:デフォルトの名無しさん
08/04/21 19:45:20
ぶっちゃけ、どこにあろうと原則として、上にあればおk。それに関しては
  init(&a, &p);
の上にあればおkってことね。

584:初心者
08/04/21 19:46:27
バブルソートの高速化手法について以下の用語を調べ説明せよって
問題があるんだけどう答えていいかわからない…教えてください

使う用語
亀(turtle)
コムソート(comb sort)

585:デフォルトの名無しさん
08/04/21 19:50:40
>>584
URLリンク(www.google.co.jp)

586:デフォルトの名無しさん
08/04/21 21:47:01
バブルソートを高速化ってアホだな。

587:デフォルトの名無しさん
08/04/21 22:02:13
結局、ポインタを理解できなかった。

588:デフォルトの名無しさん
08/04/21 22:07:10
俺はボインタッチが(y

589:デフォルトの名無しさん
08/04/21 22:08:54
Main関数で5つの整数を読み込み,
その5つの値の平均(double)を
だすプログラムを作成
せよ.
その時、5つの引数を受け取り,平
均を返す関数を呼び出し,返された平均値をmain関数
で画面出力すること


590:デフォルトの名無しさん
08/04/21 22:25:23
宿題スレ行け

591:デフォルトの名無しさん
08/04/21 22:35:58
>>589
どこからどうやって読み込むのかが不明なのでなんとも言えない

592:デフォルトの名無しさん
08/04/21 22:50:00

double average(double a, double b, double c, double d, double e)
{
  return (a+b+c+d+e)/5.0;
}

int main()
{
 printf("%g¥n", average( 2, 3, 4, 5, 6));
 return 0;
}


593:デフォルトの名無しさん
08/04/21 22:53:37
コマンドライン引数に指定したファイルのデータ長を取得するような
処理を作りたいのですが、上手くいきません

お手数かと思いますが、どなたか教えて下さい


594:デフォルトの名無しさん
08/04/21 22:57:43
Cではファイルのサイズを取得する汎用なライブラリは存在しないので
環境依存の技を使う必要がある
実際にstdioライブラリで読み取ることのできるデータ数が問題なら
実際に読んでその数を数えるしかない

595:デフォルトの名無しさん
08/04/21 22:59:38
つ ファイルを開いたらEOFまでポインタを進めて、ファイルの先頭からの
オフセット値で調べる

596:さなぎさん
08/04/21 23:02:30
カレンダー表示プログラムがうまくできません。
日付データを生成するプログラムは完成しました。そして
次のステップを目指していましたらとある問題に出会いました。
2009
000000000102030405060708091011121314151617181920212223242526272829303100000000000000
010203040506070809101112131415161718192021222324252627280000000000000000000000000000
010203040506070809101112131415161718192021222324252627282930310000000000000000000000
000000010203040506070809101112131415161718192021222324252627282930000000000000000000
000000000001020304050607080910111213141516171819202122232425262728293031000000000000
000102030405060708091011121314151617181920212223242526272829300000000000000000000000
000000010203040506070809101112131415161718192021222324252627282930310000000000000000
000000000000010203040506070809101112131415161718192021222324252627282930310000000000
000001020304050607080910111213141516171819202122232425262728293000000000000000000000
000000000102030405060708091011121314151617181920212223242526272829303100000000000000
010203040506070809101112131415161718192021222324252627282930000000000000000000000000
000001020304050607080910111213141516171819202122232425262728293031000000000000000000
2文字づつ読み込みまして
"00"の時は全角スペースを入れます。
完成イメージとしましては
2009年カレンダー

1月   2月    3月

4月   5月    6月

7月   8月    9月

10月  11月   12月

というように表示させたいのですが、fgetsコマンドがうまく使えません。
どなたかご教授くださいな

597:デフォルトの名無しさん
08/04/21 23:03:22
>>593
1. stat(filename, &stat);
2. fp=fopen(filename,"wb");fseek(fp,0L,SEEK_END);ftell(fp);fclose(fp);

598:デフォルトの名無しさん
08/04/21 23:06:24
>>593

#include <stdio.h>
#include <sys/stat.h>

int main(int argc, char* argv[])
{
 struct stat buf;
 for(int i = 1; i < argc; i++)
 {
  stat(argv[i], &buf);
  printf("%5ld bytes <%s>¥n", buf.st_size, argv[i]);
 }
 return 0;
}

599:デフォルトの名無しさん
08/04/21 23:08:08
>>596
sscanf(p, "%2d", &num);
p+=2;
printf("%3.0d", num);

600:デフォルトの名無しさん
08/04/21 23:14:55
>>596

{
 char rdbuf[256];
 char numb[4];

 fgets(rdbuf, 256, stdin);
 int year = atoi(rdbuf);

 numb[2] = 0;
 for(int i = 1; i < 12; i++)
 {
  fgets(rdbuf, 256, stdin);
  for(int j = 0; j < 31; j++)
  {
   numb[0] = rdbuf[j*2];
   numb[1] = rdbuf[j*2+1];
   printf("%s", atoi(numb) ? numb : " ");
  }
//... 月の表示とかは適当にどそ

601:デフォルトの名無しさん
08/04/21 23:40:23
>>594-595>>597-598
レスありがとうございます
>>598さんのソースを使って実行してみたところ、取得できました
が、ファイルサイズの取得でした
無知で申し訳ありませんがファイルサイズ=データ長という認識でいいのでしょうか?



602:デフォルトの名無しさん
08/04/21 23:42:41
自分で書いたんだろ
どういうつもりでデータ長と書いたんだよ

603:デフォルトの名無しさん
08/04/21 23:47:10
>>602
すみません、気分を損ねるようなつもりは全くありませんでした
例えばstrlenを使うようなイメージでした
ファイルサイズを取得する処理はできていたのですが、データ長を取得する処理だと言われ
こちらにお邪魔した次第です。ファイルサイズとデータ長の違いがわからないのです

教えて頂いたのに本当にすみません




604:デフォルトの名無しさん
08/04/21 23:52:33
いや別に怒ってはいなくてさ

データ長てのはファイルに何かしらの形式でデータが入ってて、
その長さとかそういう事なの?

605:デフォルトの名無しさん
08/04/22 00:03:49
>>604
実際にやりたかったのは指定したファイル(形式は一定でない)のデータ長を取得して
既に出来上がっている関数に飛ばすと言った処理をやりたかったのです
データ長と書いたのは恥ずかしい話なのですが関数の引数コメントに
「ファイルデータ長」と書いてあったからで、何故データ長を使用するのかわかりません

自分なりに調べてファイルサイズを取得、関数に引き渡す処理を作成したのですが
口頭で説明したところ「ファイルサイズじゃなくてデータ長」と言われ、違いがわからなかったのです
1バイト文字、2バイト文字を混ぜたようなテキストファイルを作成した時のバイト数(目算)と
単純なファイルサイズに違いがないので、何がどう違うのかすらわからなくて・・・

それでここにお邪魔したのですが、調べ方が足りなかったように思えます
自分が甘かったです。本当にすみませんでした


606:デフォルトの名無しさん
08/04/22 00:05:44
そいつに違いを聞けよ

607:582
08/04/22 00:14:48
>>583
スタイルの違いってことなんですね。
はじめて見た形だったので
関数のスコープが変わるのかな、なんて勘違いしそうでした。

どうもありがとうございました。

608:デフォルトの名無しさん
08/04/22 00:16:03
あーエスパーで答えると
1レコード固定長で可変長文字列データを複数レコード格納する場合、
ファイルサイズ != データ長 となるかもしれんね

609:デフォルトの名無しさん
08/04/22 00:18:44
>>605
本人に聞け
わかるまで聞け
要件を徹底的に具体化するのはプログラマの基本だ

610:デフォルトの名無しさん
08/04/22 00:24:05
>>605
メモリに展開しろって意味だ、多分

611:デフォルトの名無しさん
08/04/22 00:26:12
>>607
プロトタイプ宣言以前の時代から使っているロートルに多い。
あいつらは放っておくとこんなソースを書きかねない。
main()
{
double sqrt();
printf("%g\n", sqrt(.1));
}

612:デフォルトの名無しさん
08/04/22 00:28:19
>>611
まっとうなロートルは
sqrt(1.0);
または
sqrt((double)1);
と書く

613:デフォルトの名無しさん
08/04/22 00:30:21
>>611
それも立派なプロトタイプ宣言なのだが

614:デフォルトの名無しさん
08/04/22 00:34:22
>>612
0.1であることに注意。

>>613
一般的に、引き数リストがないものはそう呼ばないのでは?
いずれにしても「その頃からやってるロートル」なので、一応C99も「知っている」らしいよ。

615:デフォルトの名無しさん
08/04/22 00:46:50
>>614
引数リストのないプロトタイプ宣言はAnsi-C以前のもの
いわゆるK&RのC

そのころからやっている超ロートル


616:デフォルトの名無しさん
08/04/22 01:51:12
スレ違いだったらスマソ
今からC言語を勉強しようと思ってるんだが
windowsとLinuxどっちでやったほうがいいの?

617:デフォルトの名無しさん
08/04/22 01:54:53
windows

618:デフォルトの名無しさん
08/04/22 01:58:58
>>617
理由は?

619:デフォルトの名無しさん
08/04/22 01:59:08
今使ってるパソコンでやればいいだろ。

620:デフォルトの名無しさん
08/04/22 02:02:15
なんのためにCを勉強したいかによる
趣味なら自分のマシンに合わせればいい
職業にしようと思ってるんならまずWindowsをやり余裕があればUnix/Linux

621:デフォルトの名無しさん
08/04/22 02:04:05
windowsのほうが普及しているし統一されているから
UNIXは派生が多いし普及がいまいち

622:デフォルトの名無しさん
08/04/22 02:05:46
いずれにしても標準のC/C++を勉強するなら変わりない

623:デフォルトの名無しさん
08/04/22 07:02:18
>>622

だよな。コンソールアプリしか作れんが。
標準を覚えたいならVCなんかは却って邪魔かも知れん。
ただし、将来Windowsアプリの仕事をしたい、
と思うなら「Cを覚える」というより「VC++を覚える」、という感覚のほうがいい。


624:デフォルトの名無しさん
08/04/22 14:14:29
C言語、全くわからないのでこれから勉強しようと思うのだが参考になる書物とかある?
スレチだったらスマソ

625:デフォルトの名無しさん
08/04/22 14:15:39
K&R
独習C
ダイテルのC言語プログラミング
CFAQ

626:デフォルトの名無しさん
08/04/22 15:08:04
>LYSOZYME
MKRLIKKSAIGMFAFFVVAASGPVFAAVGDQGVDWSKYNGTYGNFGYAHDKFAFSQIGGT
YGGTFVDQATYETQVASAIAQGKRAHTYIWYQVGGSQEVAKAALDRYLPKIQTPKNSIVA
LDYEGGASGNKQANTDAILYGMRRVKAAGYTPMYYSYKPYTLANVNYKQIIKEFPKSLWI
AAYPNYEVTPVPNYSFFPSMDGISVFQFTSTYVAGGLDGNVDLTGITGNGYGKQKGQEVK
PNTATPAIENGKEANEVKGNDVEVGMTVKVNFGAKNYATGETIPQWVKGQPHKIIQKNGD
TVLLDGIMSWLSVHDVETIDASTSQPTTPAKSYIVKQGDTLSGIASNLGTNWQELARQNS
LSNPNMIYSGQVISLTGGQSGATARTYTVQSGDNLSSIARRLGTTVQSLVSMNGISNPNL
IYAGQTLNY


が格納されているファイルを読み込み各文字が何%あるかを出力ファイルに書き出すプログラムをつくって

627:デフォルトの名無しさん
08/04/22 15:31:42
作って・・・からどうすればいいんだろう?
とりあえず、作って・・・
捨てちゃった。

total 437
A : 8.92448513% ( 39)
B : 0.00000000% ( 0)
(中略)
Y : 6.63615561% ( 29)
Z : 0.22883295% ( 1)


628:デフォルトの名無しさん
08/04/22 15:38:57
>>626
#include <stdio.h>
#include <string.h>

char* hoge = "LYSOZYMEMKRLIKKSAIG・・・ 〜(省略)

void main(void)
{
    int slen = strlen(hoge), count[26] = {0}, ic = 0;
    for (ic = 0; ic < slen; ic++){
        if (hoge[ic] >= 'A' && hoge[ic] <= 'Z')
            count[hoge[ic] - 'A']++;
    }
    for (ic = 0; ic < 26; ic++)
        printf("[%c] = %.1f%%\n", 'A' + ic, count[ic] * 100.0 / slen);  
}

629:デフォルトの名無しさん
08/04/22 17:43:36
>>628
おぬしもワルよのう( ̄ー ̄)

630:デフォルトの名無しさん
08/04/22 17:46:43
>ファイルを読み込み
日本語が理解できない人かw

631:デフォルトの名無しさん
08/04/22 18:22:54
標準入力からEOFが入力出来ないって本当ですか!?

632:デフォルトの名無しさん
08/04/22 18:24:53
うそです

633:デフォルトの名無しさん
08/04/22 18:38:31
>>586
安定なソートですから、それなりに有用な場合があるのかもしれません。<バブルソートの高速化

634:デフォルトの名無しさん
08/04/22 18:38:46
宿題スレの隔離から出てこないで下さい><

635:デフォルトの名無しさん
08/04/22 18:48:22
バブルソートをどうにかしようって考えるよりも、ソートを高速化する過程に
効率の悪いバブルソートが用いられるのはよくあることだ。
そうやって、アルゴリズムを改良すると、処理時間、計算量が減って
効率が良くなるという勉強をするのさ、そういった分野の学校では。

636:582
08/04/22 18:55:24
このスレ結構にぎわってるんですね。
Cしかできない俺が最近はやりのJavaScriptに劣等感を抱いているんだが、
バカにしたもんじゃないなって嬉しくなった

637:デフォルトの名無しさん
08/04/22 19:10:25
うわー、名前でちゃった...
...ついでに質問なんですが、
/* src1.c */
int a;              // グローバル変数
int main() {
 int x;
  x = sub(a);
  printf("x: %d\n", x);
  printf("a: %p\n", &a);
  return 0;
}
/* src2.c */
int a;              // グローバル変数
int sub(int n) {
  printf(" sub::a: %d\n", a);
  printf(" sub::a: %p\n", &a);
  return n+1;
}

2つソースファイルで定義してるグローバル変数aは
それぞれでメモリの割付が行われると思うのですが、
同じアドレスのもののようなんです。
ということは、extern記述子は冗長な表現ってことになってしまうんでしょうか?
# externって他のソースファイルで定義してるからここでは宣言のみ、
# ですよってことだったと認識していたのですが

638:デフォルトの名無しさん
08/04/22 19:11:55
おいっ、ナンバーサインを全角で書くな・・・NG登録してんのにw

639:デフォルトの名無しさん
08/04/22 19:36:46
>>637
リンカがエラー出してない?
シンボルが重複してますよって

640:デフォルトの名無しさん
08/04/22 19:55:48
>>639
出ていません。
コンパイラはgccで、文法チェックが一番厳しいオプションをつけてコンパイルしても次の警告が出るだけです。
src1.c: In function 'main':
src1.c:6: 警告: implicit declaration of function 'sub'

# >>637のソースはちょっと編集していますので、6行目ではなくて実際は4行目ですが。(重要なことではありませんでしたね)
いかがでしょうか。

641:デフォルトの名無しさん
08/04/22 20:05:16
GCCのバージョンは?
古いとそういう挙動を示す。
ANSIではエラーにならなければならないが。

642:デフォルトの名無しさん
08/04/22 20:10:11
gcc-4.1.1です。
2007年1月5日にリリースされているみたいなので、古くはないとは思うのですが
何かバグでもあるのでしょうか...

643:デフォルトの名無しさん
08/04/22 20:12:08
gcc (GCC) 4.1.1 20070105 (Red Hat 4.1.1-51)
が詳細です。連レスすみません。

644:デフォルトの名無しさん
08/04/22 20:20:26
シンボルの重複はリンカの担当だから、ldの問題。
--allow-multiple-definitionあたりが渡ってないか?

645:デフォルトの名無しさん
08/04/22 20:41:56
int* TEST(int size)
{
int *retest = malloc(sizeof(int)*size);

return retest;
}

int main()
{

int *test;

test = TEST(5);

.....

free(test);

return 0;
}

こういうことをするつもりなのですが、関数TEST内でmallocしたものはfree(test)で開放できてるのでしょうか?

646:デフォルトの名無しさん
08/04/22 21:11:37
できるよ

647:645
08/04/22 21:22:44
ありがとう

648:デフォルトの名無しさん
08/04/22 21:37:15
>>645
それにしても、なにか怖い構造だね。

649:デフォルトの名無しさん
08/04/22 22:06:29
二つの整数値を読み込んでその差が10以下なら「差は10以下です。」、
差が11以上なら「差は11以上です。」と表示するプログラムを作りました。
論理OR演算子を使うとするとどのようにすればよいのでしょうか?

#include <stdio.h>
int main (void)
{
int n1, n2, sa;

puts("二つの整数を入力してください。");
printf("整数1:"); scanf("%d", &n1);
printf("整数2:"); scanf("%d", &n2);

sa = (n1 > n2) ? n1 - n2 : n2 - n1;

if( sa >= 11)
puts("それらの差は11以上です。");
else
puts("それらの差は10以下です。");

return 0;
}

650:デフォルトの名無しさん
08/04/22 22:07:28
至って普通だと思うけど何で?

651:デフォルトの名無しさん
08/04/22 22:08:12
>>650
>>648



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

5377日前に更新/199 KB
担当:undef