[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/10 00:45 / Filesize : 237 KB / Number-of Response : 985
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



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

前スレ
C言語なら俺に聞け(入門篇) Part 22
pc11.2ch.net/test/read.cgi/tech/1196489491/

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 101
pc11.2ch.net/test/read.cgi/tech/1197132472/

2 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 12:49:52 ]
Part 1 ttp://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/
Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/
Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/
Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/
Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/
Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/
Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/
Part 12 ttp://pc11.2ch.net/test/read.cgi/tech/1178620766/
Part 13 ttp://pc11.2ch.net/test/read.cgi/tech/1179301993/
Part 14 ttp://pc11.2ch.net/test/read.cgi/tech/1181735298/
Part 15 ttp://pc11.2ch.net/test/read.cgi/tech/1182719692/
Part 16 ttp://pc11.2ch.net/test/read.cgi/tech/1184003625/
Part 17 ttp://pc11.2ch.net/test/read.cgi/tech/1185286631/
Part 18 ttp://pc11.2ch.net/test/read.cgi/tech/1187213990/
Part 19 ttp://pc11.2ch.net/test/read.cgi/tech/1190342593/
Part 20 ttp://pc11.2ch.net/test/read.cgi/tech/1192455273/
Part 21 ttp://pc11.2ch.net/test/read.cgi/tech/1194384258/

3 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 13:52:23 ]
printfで
0.1
0.2



9.9
10.0
10.1
10.2

みたいに右ぞろえで出力するにはどうすればいいですか?

4 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 13:58:08 ]
右揃えなってないけど

5 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:00:40 ]
投稿したらずれてしまいました

0.1
0.2



9.9
10.0
10.1
10.2

6 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:04:40 ]
なってないじゃん

7 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:04:43 ]
printf()の実数の書式なんて忘れてるな。
ググったらこんなページあったけど。
wisdom.sakura.ne.jp/programming/c/c57.html


8 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:05:33 ]
%桁数.桁数f

9 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:09:05 ]
>>7 >>8
うまくいかないです
*0.1
*0.2



*9.9
10.0
10.1
10.2

こうしたいんです。*は空白とかんがえてください

10 名前:デフォルトの名無しさん [2007/12/22(土) 14:12:45 ]
幅指定してやればいい
右左のそろえを変えたいならマイナスつければいいし



11 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:18:20 ]
>>9
どうやったんだよ
何で自分がやったやりかたを隠すんだ?

12 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:24:09 ]
>>11
%2.2fです

13 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:25:06 ]
>>12
%ドットを含めた全体の桁数.小数点以下の桁数f

14 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:30:44 ]
>>13
できました。どうもすいません

15 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:59:48 ]
>>13
整数部分の桁数がわからない場合はどうすればいいですか?


*******1.12100912
******11.21890212
******12.12109121
*****212.21029211
***26575.12121111

みたいにしたいんですが

16 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 15:03:33 ]
あらかじめ桁数大きくしておけば

17 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:55:14 ]
>>15
* を使えば実行時に決定できる
数値はそのままで、空白を自分で追加してもいいし、どうにでなるでしょ。

18 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 18:55:29 ]
>>前999
無理。
typedef は前処理(#ifdef とか #define とかの処理)が終了した後の
コンパイル時に解析されるものであって、前処理ではその情報は使用できない。

bool を typedef するのと同時にマクロを別に定義するようにしておいて、
そのマクロが定義されているかどうかを #ifdef で判定するしかない。

19 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:14:31 ]
すいません質問いいですか?
苦しんでのHPで書いてあったことなんですが・・・

変数のところを勉強してるのですが
そこに
[ コンパイラの機能 ]
実は、このプログラムは多くのコンパイラでは動いてしまいます。
それは、C言語の拡張版である、C++(シープラプラ)では使えるからです。
また、近年決められたC言語の新規格であるC99でも使えます。
しかし、元々のC言語では使えないと覚えて下さい。

と書いてありましたが
C言語のコンパイラでは変数は使えないと考えていいのでしょうか?

20 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:21:22 ]
>>19
貴様は何を言っているのだ?



21 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:22:52 ]
>>19
その一段前を読み直すんだ。
--
変数の宣言は、基本的に、関数の先頭でしか行うことが出来ません。
例えば、次のように変数を宣言することは出来ません。
--


22 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:24:47 ]
>>21
ありがとうございます
ということはCでは変数の宣言を関数の先頭でしか行えない
しかしほかのは先頭じゃなくても行えるということでしょうか?

23 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:24:57 ]
ん?
bccで.cをコンパイルすると通らないぜそれ

24 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:28:31 ]
>>22
概ねその通り。厳密にはブロックの先頭だが。
従って、
--
int main(void)
{
printf("Hello\n");
int value; /* 変数宣言の部分 */
return 0;
}
--
の変数宣言をどうしてもprintf()の後で行ないたいならこうすればいい。
--
int main(void)
{
printf("Hello\n");
{
int value; /* 変数宣言の部分 */
}
return 0;
}
--

>>23
bccは、その筆者にとっては「多くのコンパイラ」に含まれないのだろ。
つーか、そのサイトは結構難有りだと思うがな。


25 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:31:49 ]
そのサイトのダメダメな一例。
--
fpos_t fsize = 0;
fpos_t fsizeb = fseek(fp,0,SEEK_END);
fgetpos(fp,&fsize);
fseek(fp,fsizeb,SEEK_SET);
--
この突っ込みだらけのコードは一体なんなんだか。

26 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:39:08 ]
>>24みたいにするとvalueってすぐ見えなくなるんじゃね?

27 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:39:08 ]
>>24
そうゆう書き方もありなのか・・・
もう2週間経つがまだ変数の宣言までしか覚えてない
いつになればCが覚えられるのかな

28 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:42:28 ]
>>27
日本語を覚えるのにどれだけ掛かったか、英語を覚えるのにどれだけ掛かったかを考えれば、
Cを覚えられるようになるのにどれだけ掛かるか判ろうものだ。

>>26
勿論int valueの宣言の後、そのブロックが閉じる前に使いたいだけ使えばいい。

29 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:48:00 ]
>>27
自然言語と一緒で意味を考えながら書写すればいいよ。
音読するとご近所さんから奇人扱いされそうだけど

30 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:50:15 ]
>>28-29
一応書きながらやっているから今までのことは覚えられているのだけれども・・・
文字列リテラルとか必要な言葉かどうか疑問に思ってくる


Cは覚えておいて損はないだろうから一応忘れないように
がんばっているんだがこれは無駄ではないよね?



31 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:03:24 ]
知識は無駄ではないよ。知ってると知らないなら知ってるほうがよいに決まってる。
まあ、人間の脳なんて限界があるから、細かいことまで一生覚えてる必要はないよ。
それがどこに書いてあったかを覚えといて、必要なときにすぐに参照できるようにしておけばいい。

リテラルってのがソースコードに直に書いてある値のことだと知れば、
文字列リテラルだろうが整数リテラルだろうが、別に怖いことはないでしょ。
物の名前は他人に説明するときに絶対に必要だから、嫌でも覚えてしまうよ。

32 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:04:31 ]
>>31
ありがとう
やる気が出てきたよ

33 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:07:15 ]
CってC++ってに比べて覚えること少なくね?
標準ライブラリの細かい使い方まで行くとまた別だが、
C自体の構文なんかは数日で覚えられるだろ

34 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:10:24 ]
>>33
でもほら短時間で覚えると忘れちゃうじゃん
だからゆっくり覚えてるのSA!!
まだ変数のところだけどノートに26ページ書いてあるんだよ・・・

35 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:17:57 ]
>>33
そりゃ、C++はCに++したものだからあたりまえ

36 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 00:33:27 ]
Cから1しか増えてない割には結構な増強だな
C+=2くらいじゃないのか

37 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 00:38:47 ]
っ オペレーターオーバーローディング

38 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 00:46:38 ]
くだらない質問なのですが
CのDOS窓でprintfするときに、画面で

ファイル ○を読み込みました
進行度 ○%

見たいのを表示してるのですが、1個ずつ改行されるので
それを改行しないように画面更新するにはどうやればいいのですか?
まったくやったこと無くて


39 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 00:47:54 ]
>>38
\r

40 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 01:00:40 ]
>>38
良く知らないけど、これを使えば何でもできるんじゃね?
msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpfileio/html/Toppage_Console.asp



41 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 01:10:54 ]
>>39
だめでした

>>40
ナニが描いてるのかチンプンカンプンです

42 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 01:37:42 ]
Cを先に覚えるとC++はクラスが難関かもしれんが、速攻覚えられるな。
C++から始めると、Cは速攻覚えられるな。

つまりそういうことだ

43 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 02:12:48 ]
>>41
これでだめ?
#include<stdio.h>

int main(void){
int i;
for(i = 0; i < 10; i++){
printf("%d", i);
fflush(stdout);
sleep(1);
printf("\r");
}
putchar('\n');
return 0;
}


44 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 05:09:19 ]
>>41
どう書いたらどうだめだったのか書けよ

45 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 17:03:45 ]
// 俺漏れも書いてみたー。初めてWriteConsoleとか使ったけど、こんな感じで悪くないよね?
#define STRICT
#include <windows.h>
#include <stdio.h>
#define BUFFER_SIZE 64
int main(int argc, char *argv[]) {
  DWORD written = 0;
  BOOL alloced = AllocConsole();
  HANDLE stdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  char buffer[BUFFER_SIZE] = {0};
  CONSOLE_SCREEN_BUFFER_INFO csbInfo = {0};
  
  for (int i = 0; i <= 10; i++) {
    GetConsoleScreenBufferInfo(stdOut, &csbInfo);
    csbInfo.dwCursorPosition.X = 0;
    SetConsoleCursorPosition(stdOut, csbInfo.dwCursorPosition);
    
    int len = snprintf(buffer, BUFFER_SIZE - 1, "今 %d%% ですよ", i * 10);
    WriteConsole(stdOut, buffer, len, &written, NULL);
    
    Sleep(500);
  }
  
  if (alloced) FreeConsole();
}

46 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 17:45:52 ]
キャラベースのプログラムで、プログレスバーの表示は\rを使うのが一般的?
FORMATコマンドでFDフォーマットするときに出てくるようなやつ。もっと他の方法があるの?

47 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 17:48:17 ]
エスケープシーケンスとかね

48 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 23:12:48 ]
スケジューリングの勉強をしているのですが、
データフローグラフにはどのようなデータ構造が適していますか?
また、リストスケジューリングの優先度リストに適したデータ構造についても
教えていただけないでしょうか?

49 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 01:21:13 ]
戻り値のついて誰か詳しく教えてくれ・・・orz

本読んだんだがいまいちピンとこない・・・

50 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 02:10:54 ]
ピンとこないときには、本読んだり人に話聞いたりするよりも、
自分でコード書いてコンパイル・実行するほうが理解できると思うよ。
そのコードはとりあえず本・Webのコピペでいいから。



51 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 02:18:59 ]
>>50

レスサンクス

やってみるは

52 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 02:41:12 ]
戻り値がピンとこないってのが俺にはピンとこない。
はるかな高みからの質問かもシレンが。

53 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 05:14:58 ]
C言語を触れたこともない者でも勉強できる
お勧めの参考書教えてください

54 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 08:04:34 ]
>>49
値を2倍する関数twiceがあったとする
例えば、printf("%d\n", twice(10)); のように使えば、20と表示されるとする
この、twice(10)の計算結果である20を、twice(10)の戻り値という
twice(15)の戻り値は30であるし、twice(-3)の戻り値は-6であろう

55 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 08:35:54 ]
>>49
関数をジュースの自動販売機に例えると
お金が引数(実引数)でジュースが戻値(返値)

56 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 08:50:10 ]
先生!
お釣りが出てきません!

57 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 08:54:33 ]
>>56
手数料としてイタダキマス

58 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 09:36:28 ]
>>53
推薦図書/必読書のためのスレッド 38
pc11.2ch.net/test/read.cgi/tech/1198173179/

59 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 09:47:32 ]
>>49
int f(int x) {
 return 2 * x + 1;
}

int main() {
 printf("%d\n", f(3) + 4);
 return 0;
}

とした場合、

int main() {
 int f3;
 f3 = 2 * 3 + 1;
 printf("%d\n", f3 + 4);
 return 0;
}

みたいな感じで処理される。

実際には、関数を呼ぶとその関数の中に処理が移動して、
関数の中の処理が終了すると関数を呼んだ位置に戻ってくるんだけどね。

60 名前:デフォルトの名無しさん [2007/12/24(月) 16:52:50 ]
>>49
私も初心者ですが、、
自動販売機にお金とジュースの種類の情報を与えたら、
ジュースの実体が戻ってくる。

それが戻り値
で、
ジュールの種類やらお金が引数
と考えると分かり易い。



61 名前:デフォルトの名無しさん [2007/12/24(月) 16:53:22 ]
>>55で既に説明されていたorz すんません。

62 名前:デフォルトの名無しさん [2007/12/24(月) 17:01:48 ]
struct S1 *S1 ; /* プロセス管理テーブル */

S1 = /* プロセス管理テーブルOPEN */
(struct S1 *)Open_Kansumei(...
,...
,...
,...) ;

こんな感じのCソースがあったんですが、

(struct S1 *)Open_Kansumei();

の部分の文法がよく分かりません。プロセス管理テーブルをオープンした結果を、
S1 構造体のアドレスの先頭に入れてるのは分かるんですが・・・。
関数名の前に (struct S1 *) が付いてる・・・?

63 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 17:02:11 ]
FORTRANだと、戻り値があるのがFUNCTION(関数)で戻り値がないのがPROCEDURE(手続き)
数学でいう y=f(x)が関数

64 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 17:02:57 ]
Cだと戻り値がないものも関数と呼んでいる

65 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 17:14:29 ]
>>62
構造体へのポインタを返す関数なんじゃないの?

66 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 17:15:10 ]
っていうか、入門書に載ってる短いサンプルでも適当に動かせばわかるだろ。。。

67 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 17:24:06 ]
>>62
関数 Open_Kansumei の戻り値を struct S1 * 型にキャストしている

68 名前:デフォルトの名無しさん [2007/12/24(月) 18:02:13 ]
>>67
関数の戻り値をキャストするなら、

(struct S1 *)S1 = Open_Kansumei();

では駄目なんでしょうか?
それとも関数自体をキャスト・・・? S1 自体がアドレスだから、(struct S1 *)関数名
とすると、(struct *S1)関数名
と同じ意味になるのかな・・・よく分からなくなってきました・・・



69 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 18:11:29 ]
>>68
型キャストの構文をもっぺん見直してみろ。
int x;
float y;
という2つの変数 x と y があるとき、y を int 型にキャストして x に代入するには
(int) x = y;
ではなく
x = (int) y;
と書くのが正しい。おk?

70 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 18:31:18 ]
>>68
型の名前と変数名が一緒だからごっちゃになってないか?
  struct S1 *p;
  p = (struct S1 *)Open_Kansumei(...);



71 名前:デフォルトの名無しさん [2007/12/24(月) 18:37:52 ]
>>69
あ〜そうか〜そういえば!
関数の戻り値ってのは、=で受け取らないと扱えないと思ってたけど、
関数の中に関数を使ったりできますもんね。おk、おk!


ということは、「関数の戻り値をキャストして、さらに S1 に代入している」
ということなんですね。
この場合、 S1 にはアドレスが入るから、
(struct S1 *)関数名
にキャストした結果は、アドレスになる(struct S1 * 型というのはアドレス)
と考えていいんでしょうか?

72 名前:デフォルトの名無しさん [2007/12/24(月) 19:02:48 ]
>>70
あ・・!そういう意味なんですか?

と、、すると、
(struct S1 *)
struct S1 *

は同じ意味だから、
p = (struct S1 *)Open_Kansumei(...);
の右辺と左辺は同じ型が入るということになるんですね!
よく分かりますね!

73 名前:デフォルトの名無しさん [2007/12/24(月) 19:14:34 ]
ちなみに、その関数 Open_Kansumei の引数はこんな感じ↓になってます。

int Open_Kansumei( ...
        , ...
        , ...
        , ...
        )
{
  char *adataadd; /* データアドレス */
  ...処理...
  return( (int)adataadd );
}

アドレス値を int型にして引渡し、もらい先で *型に変換する、なんてこともできるんですね。

74 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 20:36:26 ]
>>73
できるかもしれんが、行儀の良くない例だ
真似しないように

75 名前:デフォルトの名無しさん [2007/12/24(月) 20:48:00 ]
>>74
そうなんですね。読むだけにして、使わないようにします。
この場合、

return( adataadd );
...

p = Open_Kansumei(...);

とするのが普通なんでしょうか?これでも同じ意味になります?

76 名前:デフォルトの名無しさん [2007/12/24(月) 20:50:06 ]
なんで ? は、エスケープシーケンスで \? としなければいけないの?
何と区別がつかないのだ?

77 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 20:50:28 ]
そもそもOpen_Kansumei関数の戻り値の型をstruct S1 *にしておく。

78 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 20:54:32 ]
>>76
なんで ? を、エスケープシーケンスにしなければいけないの?

79 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 20:57:48 ]
>>76
三項演算子とエスパーしてみる

80 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 21:08:23 ]
>>76
「シェルが展開しようとするから」って回答がお望み?



81 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 21:16:04 ]
>>76>>78
3文字表記(トライグラフ)のため。
3文字表記は、Cが多用する記号を使えない文字コードのための代替表記を与えるもの。
まあ過去の遺物と言っていい。

??=include <stdio.h>

int main(int argc, char *argv??(??))
??<
  printf("%d??/n", argc);
??>

82 名前:デフォルトの名無しさん [2007/12/24(月) 21:43:36 ]
>>77
int Open_Kansumei( ... , ... , ... , ... )
{
  struct S1 *adataadd; /* データアドレス */
  ...処理...
  return( adataadd );
}

p = Open_Kansumei( ... , ... , ... , ... );

てな感じでしょうか。
この場合、
struct S1 *p;
をグローバルで宣言しないといけない訳ですね。

83 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:01:29 ]
いや,グローバルかどうかは関係ない.
struct S1 * Open_Kansumei( ... , ... , ... , ... )
{
  struct S1 *adataadd; /* データアドレス */
  ...処理...
  return adataadd;
}
とするのがベター.


84 名前:デフォルトの名無しさん [2007/12/24(月) 22:12:04 ]
>>83
ああ、なるほど〜
関数の戻り値の型を変えるってのは、struct S1 * Open_Kansumei() の部分を
変えないと駄目ですよね。

あとは、Open_Kansumei()関数の定義側と、呼び出し側で、
struct S1 の中身が書いてある .h ファイルを include しとけばいいってことですね。
include が嫌だったから、 return( (int)adataadd ); ってしたのかもしれないな・・・

85 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:17:26 ]
今ぷよぷよを作ってて、4つ以上繋がっているか上下左右をチェックする再帰処理で
スタックオーバーフローになってしまうのですが
11*20程度のフィールドでありえるんでしょうか
僕のプログラムがおかしいだけなんでしょうか

86 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:20:31 ]
スタックオーバーフローってメモリ不足だろ?
MSDOSでやってるならわからんでもないけど、Winでそれが出るならプログラムがおかしいかと

87 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:31:35 ]
やっぱりそうですよね・・・
こことほとんど同じやり方してるんですけど駄目みたいです
ttp://www13.plala.or.jp/kymats/study/game_other/TOKOPUYO/tokopuyo.html

88 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:34:46 ]
>>85
メモリのオーバーフローかもしれないと思うなら、
試しにチェックする数を3とか2とか、もっと少ない再帰で終わるものにしてみるといい
それでもプログラムが落ちるなら、無限再帰とかに陥っている可能性が高い

89 名前:87 mailto:sage [2007/12/24(月) 22:35:48 ]
あれ、スタックオーバーフローってメモリ不足でいんだっけ?
用語分かんね

90 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:37:15 ]
>>85
再帰だとありうるかも知れんが、まずは処理を見直したほうが良い。
再帰のネストが深すぎるかもしれない。
おかしくなさそうだったらmallocで。

>>86
スタックサイズはリンク時に決まる。
実メモリのサイズとは関係ない。
VisualC++の場合、デフォルトは1MBらしい。




91 名前:デフォルトの名無しさん [2007/12/24(月) 22:42:14 ]
動的メモリが動作中のプログラムと同じOS上で、デフラグをするとメモリの
内容が移動してしまったり、、、って事態は起こるんでしょうか?

他に、デフラグをするとおかしくなっちゃうような組み方ってどんなのがあります?

92 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:46:21 ]
>>88
カウントが3900とかになってるので無限ループっぽいですw
ちなみに右方向限定とかならエラーは出ないです
ありがとうございました

93 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 23:06:38 ]
>>91

デフラグ、ってHDDのデフラグだよね?
いくらなんでもそんなへぼいメモリ管理をしてない。


94 名前:デフォルトの名無しさん [2007/12/24(月) 23:08:30 ]
>>93
ですよね・・・。
デフラグでどうにかなっちゃうような実装があるとしたらC言語以外の何かなのか・・・。
とりあえず、C言語ではそういう実装はありえない、ってことでいいんですよね?

95 名前:デフォルトの名無しさん [2007/12/24(月) 23:11:56 ]
C でよく、int argc; とか、char *argv; なんて名前の変数をみかけるんですが、
どんな役割を持つ変数なんでしょうか?一般的に・・・。たいていコメントがないので・・。



96 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 23:14:36 ]
>>95
コマンドライン引数が格納される

97 名前:デフォルトの名無しさん [2007/12/24(月) 23:17:25 ]
>>96
なるほど。ありがとうございました。

98 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 23:21:07 ]
>>94

C言語は関係なく、OSの実装次第。
デフラグでおかしくなるとしたら、
デフラグツールがおかしいか、OSがおかしいかのどっちか。


99 名前:デフォルトの名無しさん [2007/12/24(月) 23:34:17 ]
>>98
datファイルなんかを動的に持つってことは可能でしょうか?
で、また読み込みに行ったときに、デフラグされてると、どこにあるか分からなくなる、、とか。。

基本的にファイルはHDDに保存するもので、「動的」って概念すらないんですよね・・・?
あるいはファイル名を動的メモリに持つ・・・とか?う〜ん・・・

どう頑張っても、Cの実装次第で、デフラグされるとおかしくなるようなプログラムは作れない・・・ですよね?

100 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 23:46:02 ]
OSのファイルシステムドライバを通さずにディスクを直に読み書きしてたりすると、
デフラグでおかしくなるようなことはあるだろう。



101 名前:デフォルトの名無しさん [2007/12/24(月) 23:51:23 ]
>>100
なるほど。。それかもしれないです。
OSのファイルシステムドライバを通さないと、実装がカンタンとか、
そういうメリットがあるんでしょうか?

102 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 23:54:14 ]
>datファイルなんかを動的に持つってことは可能でしょうか?

ファイルを動的に持つ、ってどういう意味?

>で、また読み込みに行ったときに、デフラグされてると、どこにあるか分からなくなる、、とか。。

そうはならない。そのあたりはファイルシステムがどうにかする。


>どう頑張っても、Cの実装次第で、デフラグされるとおかしくなるようなプログラムは作れない・・・ですよね?

CじゃなくてOSの実装だってば。
C言語的には、HDDのセクタを直接読み書きするような物だったら、
デフラグでおかしくなる可能性はある。
が、まともなOSならドライバじゃない限り
HDDのセクタを読み書きできないようになってる。

HDDのセクタを直接読み書きせず、ファイルシステムを経由してアクセスするなら、
おかしくなることはない。



103 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 23:55:28 ]
>>101

逆に実装が難しくなるので、特殊な用途にしか使わない。
データ復旧ツールとか。


104 名前:デフォルトの名無しさん [2007/12/25(火) 00:08:09 ]
>>102-103
う〜ん・・・そうですか。ありがとうございます。
ドライバやデータ復旧ツールを開発する訳でもないので、
私の聞き間違いか、言った人の勘違いかなんかでしょう・・・。
ありがとうございました。

105 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 00:15:19 ]
>>101
それこそ自分でデフラグするソフトを作るのでもない限り不要だね

106 名前:デフォルトの名無しさん [2007/12/25(火) 00:42:37 ]
お初です。

getch関数の質問なんですが

文字入出力関数を作成したのですが2バイトキーを無視する処理で

iKey = getch();

if ((0x00 == iKey) && (0xe0 == iKey)) {
getch();
}

というソースを書いたのですが、iKeyの型をintからcharにするとなぜかifの条件に引っかからなくなってしまうんですが、なぜなのでしょう???

知恵をお貸しください。

107 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 00:55:10 ]
△ char
○ unsigned char

char が符号無しな環境なら char でも動くが。

0xe0 の型は int 型で、これは 224 という値に相当するけど、
char が符号つきだと、iKey = 0xe0 として iKey に入っている値はまあ大抵は -32 になる。

108 名前:デフォルトの名無しさん [2007/12/25(火) 00:58:11 ]
こんなソースがあるんですが、

int a;

struct S1 {
  struct {
    int i;
    HANDLE h;
  }S2[100];
} ;


...
S1->S2[a].i = 001519 ;   /* 001519は時分秒 */


S2[100]とされているものに対して、S2[a] を入れることによってどうなるのかが
よく分かりません。これは、構造体の配列・・・?

109 名前:デフォルトの名無しさん [2007/12/25(火) 01:04:32 ]
早速の返答ありがとうございます。

このことをC言語の初心者にも分かり易く説明してくださいと言われたらどう答えますか?

110 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:05:38 ]
>>109
そのまま教えればいいだろ。
わからなかったら分かるまで考えてもらえばいい。



111 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:13:13 ]
本気で話し出すと汎整数拡張の話になってしまうが、
まあ簡単に言うなら char が符号つきだと
0xe0 は値の範囲から外れちゃうから等しくなんないよ、と。

112 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:13:52 ]
>>108
構造体の配列。

113 名前:デフォルトの名無しさん [2007/12/25(火) 01:14:03 ]
ちなみに説明するというのがメインの課題なので

おしえてもらった通りに説明したいと思います。

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

114 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:19:48 ]
ビットシフト操作に関して、算術シフトと論理シフトの、
どっちを行うかは、規格できっちり決まっているものですか?

115 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:22:24 ]
>>114
signed なら算術
unsigned なら論理

116 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:23:18 ]
>>115
unsigned なら論理シフトだが、
signed の場合にどうするかは規格で決められていない。処理系定義。

117 名前:115 mailto:sage [2007/12/25(火) 01:25:34 ]
>>116
ぅぉ、マジカ。知らんかった…トンクス。

118 名前:デフォルトの名無しさん [2007/12/25(火) 01:27:04 ]
>>112
なるほど・・・。

int a = 5;

だとしたら、S2構造体の 5番目の変数 i にアクセスしてるってことなんですね。

  S1->
となってるのは、なんでなんでしょうか?

119 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:29:09 ]
S1-> なんてできるはずがないんだが。

120 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:31:30 ]
× S2構造体の 5番目の変数 i
○ S1 のメンバである、無名の構造体の配列 S2 の 5 番目の要素の、メンバ i



121 名前:デフォルトの名無しさん [2007/12/25(火) 01:32:23 ]
>>119
そうなんですか?
至るところで、

S1->

をやってます。。そもそもなんで入れ子なんだろう・・・構造体要素1個なのに
至るところで入れ子やってます・・。

122 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:33:46 ]
struct {
 struct {
  int i;
  HANDLE h;
 } S2[100];
} S1[1];

となってないか?

123 名前:デフォルトの名無しさん [2007/12/25(火) 01:36:54 ]
>>120
「S2」は「構造体の配列名」であって、「構造体名」ではないんですね。
構造体名は無名なんですね。

メンバ i
は、構造体配列 S2 の5番目の要素の無名構造体のメンバ i
って感じでしょうか。

124 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:41:05 ]
まあ言葉で表現すると難しいが、とりあえず

                       こいつのことだ
                              ↓
  S2[100]  [i | h] [i | h] [i | h] [i | h] [i | h] [i | h] [i | h] ... [i | h]
         S2[0] S2[1] S2[2] S2[3] S2[4] S2[5] S2[6] ... S2[99]

125 名前:デフォルトの名無しさん [2007/12/25(火) 01:41:56 ]
>>122
あ、すみません!
S1->S2[a].i = 001519 ;
をやる前に、

struct S1 *S1 ;

となってました。
この場合、また型名と変数名が同じなので、
S1->
がどっちを指してるか分からないのですが・・・(n

126 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:42:53 ]
>>125
単に構造体タグ名と変数名が同じというだけだな。
S1-> の S1 は変数名。

127 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:45:39 ]
001519 ってのが凄く気になる。
こう書くと 8 進数になるけど 9 ってのが入ってて、
エラーになるはずだが。

128 名前:デフォルトの名無しさん [2007/12/25(火) 01:49:53 ]
>>124
どうもご丁寧にありがとうございます。
なるほど。分かり易いです。
>>126
struct S1 *p ;
p->
ってことですね。なんで分かるんですかぁぁ・・??

p->
だとすると、なんでわざわざポインタ型にして、入れ子の中の構造体に
アクセス??あああ訳が分からない・・・・結局 i には何が入っているの・・・

129 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 01:56:13 ]
>ってことですね。なんで分かるんですかぁぁ・・??
構造体タグ名を使って S1-> という風にはできないから
S1 は何らかのポインタであるはずだ、ということになる。
C だと構造体タグ名と同名の変数を作る事はできるけど、普通は紛らわしいのでやらない。

>結局〜
例えば

struct S1 hoge;
struct S1 *S1 = &hoge;

とした場合、S1->S2[a].i は hoge.S2[a].i と同じことになる。

130 名前:デフォルトの名無しさん [2007/12/25(火) 01:59:49 ]
>>127
すみません。001519 に入ってる値は、ビット演算子で時分秒をいろいろ
ゴチャゴチャやっていた値が入っていて、ビット演算子がよく分からなかったので、
>>105 の書き込み時間を適当に入れてみただけなんです。

晒してしまうと、

struct tm tagTime;
  pstm = &tagTime;
    nRunTime =      /* 時分秒設定 */
     (((((((pstm->tm_hour / 10) << 4) | (pstm->tm_hour % 10)) << 8) |
     ((pstm->tm_min / 10) << 4) | (pstm->tm_min % 10)) << 8) |
     ((pstm->tm_sec / 10) << 4) | (pstm->tm_sec)) << 8 ;

S1->S2[a].i = nRunTime ;

ってなことをやってます。



131 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 02:01:03 ]
まあ、ちゃんとやってるのならいいのよ。

132 名前:デフォルトの名無しさん [2007/12/25(火) 02:03:20 ]
#include<stdio.h>
int gcm(int a,int b);
int gcm(int a,int b){
int amari;
if( a < b ){
while(1){
amari = b % a;
if( amari == 0 ){
return amari;
break;
}else{
a = b;
b = amari;
}
}
}else{
while(1){
amari = a % b;
if( amari == 0 ){
return amari;
break;
}else{
b = a;
a = amari;
}
}
}
}

133 名前:デフォルトの名無しさん [2007/12/25(火) 02:04:01 ]

int main(void){
int x,y;
int ans;

printf("*********最大公約数の計算をします********\n\n\n");
printf("1つ目の整数値を入力してください:");
scanf("%d",&x);
printf("\n2つ目の整数値を入力してください:");
scanf("%d",&y);
ans = gcm(x,y);
printf( "\n\n\nGCM(%d %d) = %d", x, y, ans);

return 0;

}

134 名前:デフォルトの名無しさん [2007/12/25(火) 02:06:00 ]
>>132
>>133
ユークリッドの互助法のプログラムを書いてみたんですが、
二つの数値入力してエンターキー押したらコマンドプロンプトの画面がすぐ消えてしまいます。

自分ではこれであってると思うのですがどこがおかしいか見てもらえますか。
お願いします。

135 名前:デフォルトの名無しさん [2007/12/25(火) 02:07:28 ]
>>129
>S1->S2[a].i は hoge.S2[a].i と同じ
が難解すぎる・・・orz

>>129を考えながら寝ることにします。
夜分遅くまでお付き合いいただき、大変ありがとうございました!
おやすみなさい。

136 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 02:08:21 ]
>>134
Ctrl+F5 で実行すると消えない。
あるいは、最後にもう1つ入力をいれておくか。

まあ、まだバグがあるようだが、それは考えてくれ。

137 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 02:09:10 ]
>>135
図を書くといいよ。

138 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 02:10:18 ]
>>134
一瞬で終わる計算なんだからそれで正しいだろう

139 名前:デフォルトの名無しさん [2007/12/25(火) 02:15:39 ]
>>136
>>138
Ctrl+F5なら消えないんですかほむほむ。
return amariを return bに直したら正常に計算する事ができました。
ありがとうございます。


140 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 02:20:07 ]
>>135
(*S1).S2[a].i と同じではどうだ。



141 名前:デフォルトの名無しさん [2007/12/25(火) 09:48:22 ]
失礼します。
現在、MSNメッセンジャーで受信したメッセージから特定のコマンドを抜き出して
別のアプリケーションへ送るというソフトを作ろうとしています。


そこで、まず、あらかじめアクティブにしておいたメッセンジャーで受信した文字列を
1秒間隔でCTRL+A CTRL+Cを利用して取り込む・・・という方法を調べているのですが分かりません。

どなたか答えていただける方がいればよろしくお願いいたします。

142 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 09:57:58 ]
>>141
メッセンジャーでやったことはないけど
直接ウインドウテキスト取れないか?

143 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 09:58:48 ]
>>141

スレ違い。
VisualC++スレへ。
pc11.2ch.net/test/read.cgi/tech/1196430042/


144 名前:デフォルトの名無しさん [2007/12/25(火) 10:02:25 ]
>>142
SetWindowText()ってやつでしょうか?

>>143
あれ・・・ここじゃだめなんでしょうか?

145 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 10:14:18 ]
>>144
スレタイ読める?

146 名前:デフォルトの名無しさん [2007/12/25(火) 10:17:47 ]
>>145
いや、C言語・・・。

147 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 10:18:40 ]
>>146
Win32API質問箱 Build60
pc11.2ch.net/test/read.cgi/tech/1196874830/

148 名前:デフォルトの名無しさん [2007/12/25(火) 10:42:28 ]
>>146ですが移動します。

149 名前:デフォルトの名無しさん [2007/12/25(火) 11:57:03 ]
初心者ですが。
データ型って意味あんすか?・・・
signed long intとか long intと同じじゃないすか?

undigned型とかって使ったりすんでしょうかね?

150 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 12:05:08 ]
>>149
long intはsigned long int の省略みたいな物だからまあ同じだろうね

unsignedは使うだろ
signedで桁数が足りなくて、負数を扱わない時とか



151 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 13:05:17 ]
>>149
・-(マイナス)の値がありえない変数のバグ防止
・char型については、signedを指定しないときの符号の有無は処理系依存

意味無いものなんて無い。必要に応じて使い分けるべし。

152 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 14:01:54 ]
%lfで表示すると0.0000とかになるんですが、
eを使って表示させると6.111e-20とか、計算誤差の分が表示されてしまいます。

解決する方法はありますか?

153 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 14:17:04 ]
>>152
どう表示させたいのかわからない。
%3.1e とか?

154 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 14:26:40 ]
>>153
eを用いて表示させたいんですが、精度は小数点以下5桁ぐらいで、それいじょうはeの表示に反映させないようにしたいです

155 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 14:33:16 ]
こんな感じか
if (fabs(x) < 0.00001) {
x = 0;
}
printf("%e", x);

156 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 14:36:21 ]
>>155
0のときだけじゃなく、どんな数字にたいしても精度を切り捨てたいんです

157 名前:デフォルトの名無しさん [2007/12/25(火) 15:50:41 ]
いま、ポインタとファイルオープンまで学んだんだが。
あんたら何作ってる?
俺はアドレス帳など作ってみたんだが他にやりがいのある物はないか?


158 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 15:58:25 ]
オセロとかテトリスとか簡単なゲームなんかどうかな

159 名前:デフォルトの名無しさん [2007/12/25(火) 16:06:06 ]
テトリスとか敷居高そうっすね。
物体が動くようにしたり

160 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 16:17:08 ]
>>156
つ[%.5g]



161 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:05:39 ]
正数同士の除算の切捨て誤差を
四捨五入で求めたいのですが、
どういう風に書けばいいでしょうか。
今は下記のようにしています。

int n,m,d

n = m / d;
if( (m % d) > (d >> 1) ) n ++;

162 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:20:57 ]
それのどこが切り捨て誤差?

163 名前:デフォルトの名無しさん [2007/12/25(火) 17:26:47 ]
そもそも整数演算で打ち切り誤差など発生しない。


164 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:30:17 ]
>>160
うまくいきません。6.111e-20とかでてきます。

165 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:30:43 ]
>>164
どう表示させたいのかわかんあいんだよ

166 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:36:17 ]
>>165
double型の変数の
小数点以下、例えば5桁だけを利用して表示したいんです。

0.000000002121なら0を表示したいです。
数がでかくなったらeを使ってすっきり表示したいです

167 名前:デフォルトの名無しさん [2007/12/25(火) 17:42:13 ]
#include<stdio.h>


char pai[3][9] = { {'1','2','3','4','5','6','7','8','9'},
{'@','A','B','C','D','E','F','G','H'},
{'一','二','三','四','伍','六','七','八','九'},
};
int main (void){
printf("%c",pai[0][2]);

return 0;

}
これで3という文字が表示されるはずなんですがうまくいきません。
どうなおせばいいのでしょうか。

168 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:43:44 ]
>>166
こうか?
if(fabs(x)>=1000){
printf("%e", x);
}else{
printf("%f", x);
}

169 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:46:20 ]
>>167
Warningいっぱい出なかった?
3はマルチバイト文字だから、'3' とやったら半分しか入らんぞ

170 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:48:37 ]
>>166
二度手間だけど、丸めと表示の二段階で行なう。
void print(double foo)
{
char buf[20];
sprintf(buf, "%.5g", 1 + foo);
printf("%.5g", atof(buf) - 1);
}



171 名前:デフォルトの名無しさん [2007/12/25(火) 17:50:40 ]
>>166
自分の好きにフォーマットをコントロールしたいなら、
もうprintfのフォーマット機能に頼らず、
自分でフォーマットするプログラムを書いた方が早くないか?
いや、そんな気がする。どうだろう?

172 名前:デフォルトの名無しさん [2007/12/25(火) 18:18:21 ]
てす

173 名前:デフォルトの名無しさん [2007/12/25(火) 18:27:50 ]
>>169
3をいれるのにはどうやればいいんですか?

174 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 18:35:19 ]
>>173
そりゃキミがどうしたいのかによって変わってくるが・・・
char pai2[3][9*2+1] = {
{"123456789"},
{"@ABCDEFGH"},
{"一二三四伍六七八九"},
};

printf("%c%c",pai2[0][2*2],pai2[0][2*2+1]);
これでも一応出るんで、あとは考えて。

175 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 18:36:41 ]
>>167,173
●文字列にする方法
char pai ⇒ const char *pai
'3'など ⇒ "3"
printf() ⇒ printf("%s", ...


●ワイド文字にする方法
char pai ⇒ wchar_t pai
'3'など ⇒ L'3'
printf() ⇒ wprintf(L"%lc", ...

かなあ? いまいち自信なし。


176 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 19:18:52 ]
>>167

char pai[3][9] = { {'1','2','3','4','5','6','7','8','9'},
{'@','A','B','C','D','E','F','G','H'},
{'一','二','三','四','伍','六','七','八','九'},
};

↑この時点でスタック壊してるな。
何が起こっても不思議ではない。
ワイド文字にしたほうがよい。


>●ワイド文字にする方法
>char pai ⇒ wchar_t pai
>'3'など ⇒ L'3'
>printf() ⇒ wprintf(L"%lc", ...

処理系がわからんが、VCなら L'3' じゃなくて_T('3')のほうがいい。


177 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 19:38:19 ]
>>161
n = (m+0.5)/d;

178 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 19:53:57 ]
>>176
ワイドじゃないとダメだから _T にしたらあかんがな。

179 名前:デフォルトの名無しさん [2007/12/25(火) 23:07:29 ]
某サイトの問題をやってみました。
【問題】
文字列Aのm番目からn個分の文字列を配列Bにコピーする
サブルーチンを作れ。
ただし、m,nの値が文字列Aの範囲を超えるような値が入力
されたら1を返し、正常にコピーできたら0を返す。

こんなプログラム組みました。
問題中のm,n,文字列A,Bの各オブジェクト名,サブルーチンの返値は
勝手に解釈して組んでます。(正常時TRUE(1),異常時FALSE(0))


180 名前:デフォルトの名無しさん [2007/12/25(火) 23:08:45 ]
#include <stdio.h>
#include <string.h>
#define STR_MAX 10
#define TRUE 1
#define FALSE 0
typedef unsigned short BOOL;
BOOL BlockCopy( unsigned char*, unsigned char*, short, short );
// メイン関数
int main( void )
{
unsigned char szSrcName[STR_MAX+1];
unsigned char szDstName[STR_MAX+1];
short nStartPos = 0;
short nCopyLen = 0;
printf( "Input Str : " ); scanf( "%10s", szSrcName );
printf( "Input StartPosition : " ); scanf( "%d", &nStartPos );
printf( "Input CopyLength : " ); scanf( "%d", &nCopyLen );
if( BlockCopy( szDstName, szSrcName, nStartPos, nCopyLen ) == FALSE )
{
puts( "Error!!" );
return 1;
}
printf( "入力文字列 : %s\n", szSrcName );
printf( "コピー文字列 : %s\n", szDstName );
return 0;
}



181 名前:179,180 [2007/12/25(火) 23:09:25 ]
// サブルーチン関数
BOOL BlockCopy( unsigned char* s1, unsigned char* s2, short m, short n )
{
int i;
short nLen = strlen( s2 );

if( nLen < m || nLen < (m+n) || nLen < n )
return FALSE;
memcpy( s1, s2+m, sizeof(char)*n );
return TRUE;
}

動作的には問題ないと思ってますがアドバイスお願いします。
また、この組み方はセンスないぞと思われる方は、よりよい
プログラムの組み方を教授して頂ければ幸甚です。

182 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 23:20:56 ]
Windows2003Server上でVMware Serverを使ってRHE3を動かしてます。
その上でlibjpeg.soを使ったjpeg圧縮ライブラリを作りましたが、
jpeg_create_compress()を実行した時点で以下のメッセージが出て先に進みません。

JPEG parameter struct mismatch: library thinks size is 372, caller expects 376

構造体のサイズが合っていないと言ってるのはわかるのですが、
libjpeg.soとjpeglib.hのVerは合わせてありますし、
同じ名前のファイルが複数存在しない事も確認済みです。

どなたか解決方法を知らないでしょうか?


183 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 23:40:13 ]
>>181
・無闇とshortを使うのはよくない。
・sizeof(char)が1であることを前提としている関数を使うのにsizeof(char)を掛けるのはおかしい。
・「文字列をコピーする」関数なのだから、ナルターミネートは保証するべき。

ってことで、判定部を除くとこれでいい。
sprintf(s1, "%.*s", n, s2 + m);

184 名前:デフォルトの名無しさん [2007/12/25(火) 23:55:05 ]
C言語でポートを選び、指定して
相手とファイルをやり取りするってプログラムを作りたいんだが。

どんな関数とか使うんだ?接続など

185 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 23:57:46 ]
>>184
環境と使うライブラリによって違う。

186 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 00:05:04 ]
相手==

187 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 01:13:18 ]
>>180
その手の文字列処理関数は、コード見ないとどの引数が入力でどれが出力か分からないから、
プロトタイプ宣言だけで分かるようにconst付けたり仮引数名を工夫したりするといい

BOOL BlockCopy(unsigned char* dst, const unsigned char* src, short, short );

188 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 01:24:37 ]
>>182
.so と .h の不整合ではなくて、.so を作ったときのコンパイラ(構造体
のパディング)とそれを利用するプログラムのコンパイラ(構造体のパディ
ング)が違うんだろう。


189 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 08:30:05 ]
>>182
#pragma pack(push,4)
#include"jpeglib.h"
#pragma pack(pop)

もしくはコンパイルオプションで指定

190 名前:182 mailto:sage [2007/12/26(水) 10:42:05 ]
>>189

#pragma指定を追加する事で無事にプログラムが流れました。
gdbで構造体を確認しましたが壊れている様子もありませんでした。
どうもありがとうございました。



191 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 14:01:12 ]
printf("%.4s", s);

の%.4sってどういう意味でしょうか?

192 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 14:08:20 ]
>>191
最小幅と最大幅の指定のうち、最小幅を省略したもの

193 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 14:45:17 ]
>>192
ありがとございました。

194 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:07:06 ]
質問いいですか

#include <stdio.h>
int main(void)
{
printf("%d\n",10*2);
return 0;
}
この場合関数の型名ってあんまり意味ってないんですよね?
変数宣言などするときに意味があったりするんですか?

195 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:16:37 ]
もうちょっと何が聞きたいのかはっきりしてくれ。
関数ってどっちの関数?main?printf?
型名って何の型名?引数?戻り値?

196 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:21:20 ]
>>194
質問の意味がよくわかんね
printfは可変長引数
floatとか使いたいとき明示的に
接尾子のfを付けたりする

197 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:24:32 ]
main の戻り値に意義が見いだせないという事なのか、
それとも printf の戻り値を使ってないという事に関する疑問か。

198 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:43:08 ]
うぉ・・・エスパーできん・・・

199 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:48:27 ]
これは10*2に対して、一時変数に格納する意味なんて無いよね?っていうことでは

200 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:51:30 ]
>>195
だって苦しむなんちゃらには
型名 関数名(引数){なんちゃら}
で関数って書いてあったんだもの><

>>199
そのとおりでございます



201 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:04:26 ]
>>200

やっぱりわかんね。

int temp = 10 * 2;
printf("%d\n",temp);



printf("%d\n",10*2);

は、最適化されて同じバイナリが吐かれるよね?、ということを聞いてる?


202 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:08:03 ]
あー printf にも戻り値は int型 って関数バイブルみたいな本に書いてあったな。
そういうことじゃ?

203 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:09:55 ]
>>201
#include <stdio.h>
int main(void)
{
printf("%d\n",10*2);
return 0;
}
の場合intは文的には必要だが機能としてはまったく意味はない??が
#include <stdio.h>

int main(void)
{
printf("%d\n",(int)(1.05 * 360));
return 0;
}
のようにキャスト変換などするとintが使用されるっていうか
意味があるっていうか・・・・
そんな感じです

204 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:11:45 ]
>>203
そもそも関数の型の意味を理解していないな。
int mainのintは戻り値(OSに正常終了か否か)をreturn 0 か1かで必要だからint mainなんだよ。


205 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:13:56 ]
>>204
まだそこまでたどりついてません・・・
今苦しんでのキャスト変換のところなんで
もっと勉強すればわかることなんですね

206 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:17:41 ]
>>203
関数の戻り値が分かってない?
これは何をしているかわかる?

int unko(int x) {
int z = x*2;
return z;
}

int main()
{
int temp = unko(100);
return 0;
}


207 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:18:11 ]
キャスト変換はただその時の型を「一時的に強制的のその型にする」って理解すればいいと思うよ。
int main(void)

    〜〜〜
    return 0;

は、関数の章で学ぶと思うから、
今は明示的に書かなければならないと思っておけばOK。
あまり先飛びすぎても混乱するだけだしね。


208 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:46:21 ]
>>203
整数リテラル 10 はそれ自体としてintという型を持っている。
整数リテラル 2 もintで、int*intの結果はint型になることになっている。

209 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:52:30 ]
ってそういうことじゃないのか。

210 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:03:58 ]
>>194
とりあえず総じて何が聞きたいのか理解できん。
まずはここあたりを順に読んで、基本を覚えよ。
ttp://homepage1.nifty.com/toshio-k/prog/c/



211 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:29:52 ]
>>205
そのサイトは地雷原だから、他で勉強することを強くお勧めする。

212 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:31:17 ]
www9.plala.or.jp/sgwr-t/
ここオヌヌメ
友達から教わったけど、ここだけでCの基礎はバッチリ・・・?覚えたよ
ていうかC言語でググると一番上に出てくる

213 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:43:51 ]
>>212
あー、間違いをそれと知らずに教わるにはいいかも。

214 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:44:32 ]
どういうこっちゃ?

215 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:46:46 ]
今時 C から始めるのは損だよ。
C++ の本でも最初のうちは C と似たようなもんだし、
その延長で C++ まで覚えてしまった方が絶対得だよ。

216 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:47:18 ]
いきなりC++はどうだろうか。
C++はしょっぱなからクラス教えないっけ?

217 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:57:32 ]
C++が仕様としてカバーしているCとしての意味での、C++ってことじゃない?
まずCをやるんだけど、mallocとかFILE*とか、C++ではとって変わった部分を捨てて、
そのままC++のクラスなりnewなりをやれ、みたいなぁぁぁ

218 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:58:16 ]
>>214
間違いがあるってことだろ。間違いかどうかは微妙だけど、こういう書き方されるともにょる。
>つまり、書き換える必要のある文字列は、一旦文字型配列に格納してから処理をするのが無難だと言えます。
# 無難も何も、文字列リテラルを書き換えるのは論外なわけで……

219 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 00:08:39 ]
言葉が足りないんじゃないか
格納=コピーならいいけど、ポインタだけ格納してもね

220 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 03:29:34 ]
#include<stdio.h>
int main(void)

{
int i,d=97,c=65;
char ca;

scanf("%c",&ca);

for(i=65;i=<90;i++){
if(ca=c){
ca=d;
breke;
}
else{
i++,d++,c++;
}
}

printf("ca = %c ",ca);

return 0;
}

なんでこれがコンパイルできひんのじゃ!C言語死ねッ!!!!!



221 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 03:47:14 ]
if(ca=c)がおかしい
比較じゃなく代入してる

222 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 03:49:14 ]
ほんまや!!!!!



すまんかった・・・・・

223 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 03:49:59 ]
んでfor分の終了条件が=<なんて演算子はない。 <= だ。
ついでにbreak。brekeなんてない。

224 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 03:50:30 ]
ていうかコンパイルエラー見れば原因わかるんだけど、コンパイラ何使ってるんだ???

225 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 03:51:48 ]
ボーランド
プロンプト読めない

226 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 03:53:10 ]
hp.vector.co.jp/authors/VA017148/pages/install/bcc.html
オヌヌメ

227 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 03:56:51 ]
ありがじゅう。
お気に入り追加した

この恩は忘れるまで忘れない!

228 名前:デフォルトの名無しさん [2007/12/27(木) 04:03:27 ]
>>220
コンパイラタン(AA略)「なんでよ私一生懸命やってるじゃん!なんでそんなこと言うの!・・・ヒドイヨ・・・・・」

229 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 04:09:30 ]
コンパイラタン「と、途中でそんなの挿入したら、(エラーが)で、出ちゃうじゃない・・・・・!!!」

230 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 04:37:37 ]
その夜”ピ、ピ、”と言う不思議な音が深夜の闇の中木霊しつづけた・・・



231 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 04:43:19 ]
コンパイラタン「だ、だめっ!そこに"Shift"しちゃダメェェェェェ!!!」

232 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 07:24:49 ]
自分で色々検索して、何度も本を読み返したのですが判らないので質問です。
下記のソースでコンパイルは通るのですがIF文で条件外でも処理を実行してしまうようなのです。
どこが間違っているのか教えてください。お願いします。

#include <stdio.h>
#include <ctype.h>

main() {
  int i;
  int date[10];

  for(i=0 ; i<10 ; i++) {
    scan:
    printf("%d個目のデータ:", i+1);
    fflush(stdin);
    scanf("%d", &date[i]);
    if(isdigit(date[i]) == 0) {
        printf("数値を入力してください。\n");
        date[i] = 0;
        goto scan;
    }
 }
  printf("前から6個目のデータ:%d", date[5]);
  return 0;
}


233 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 08:13:57 ]
scanf("%d", &date[i]);
既にここで入力を数値として変換してしてるので scanfの戻り値を調べるといいよ。
isdigitは文字が('0'〜'9')かどうか判定する関数。
それとこの状況でわざわざコードを読みにくくするgotoを使用する意味はない。
whileとbreakで代用したほうがいい。

234 名前:232 mailto:sage [2007/12/27(木) 08:27:31 ]
>>233
ああ、そっか。%dだから受け取った時にすでに数値になってるんだ。なるほど。
じゃあこの場合文字を入れさせないようにするにはどういう風にしたら良いのでしょうか?

>whileとbreakで代用したほうがいい。
たしかにその通りです。気をつけます。

235 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 08:27:50 ]
>>232

> main() {
>   int i;
>   int date[10];
>
>   for(i=0 ; i<10 ; i++) {
>     scan:
>     printf("%d個目のデータ:", i+1);
>     fflush(stdin);
入力ストリーム(stdin)のフラッシュは未定義
したこと無いけどたぶんフラッシュされない。
>     scanf("%d", &date[i]);
>     if(isdigit(date[i]) == 0) {
isdigitの引数は文字。'1'は文字。1は数値。ってな感じ。
>         printf("数値を入力してください。\n");
>         date[i] = 0;
>         goto scan;
>     }
>  }
>   printf("前から6個目のデータ:%d", date[5]);
>   return 0;
> }
>


236 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 08:28:52 ]
>>232

まず、直接関係ないが、

        goto scan;

↑これは止めれ。こういうときはwhile文を使うのがセオリーだ。


isdigit()は「文字が数字かどうか」を判定する関数だよ。
scanf()で変換すると「数値」(int型)になるので、

    scanf("%d", &date[i]);
    if(isdigit(date[i]) == 0) {

これだとisdigit()は常に0を返すはず。
それに、scanf("%d", &date[i]); の場合、数字の入力を期待しているので、
それ以外の文字は入力されてもdate[i]に入らない。


237 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 08:38:22 ]
>>210

 main()

これでCマガジンに連載できるなんて…。・゚・(ノД`)・゚・。
休刊もやんぬるかな。



238 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 09:29:02 ]
>>237
省略した場合はintって決まりなかった?
だから一応正しいんじゃない?

239 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 09:31:09 ]
>>234
scanfの戻り値を利用する
scanfはスキャンに成功した数を返すから、
今回のケースで文字を入力されたら0が返る

240 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 09:35:56 ]
>>232
>scanf("%d", &date[i]);



241 名前:デフォルトの名無しさん [2007/12/27(木) 09:43:47 ]
途中でエンター押しちゃったw
>>232
>scanf("%d", &date[i]);
こういう取り方は文字/数字チェックそのものに意味が無いのでやめ

普通はバッファの文字列変数を用意させて、そこに入力させる。
それをisdigit()に通してクリアしたら、その時点でdate[i]に代入するようにすればいい。


242 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 11:13:33 ]
たぁすけてぇぇぇ!
結果がへんになる!!!

#include<stdio.h>
int main (void)
{
int a,c;
float b,d;
b=1,d=1;
scanf("%d",c);

for(a=1;a<=1000;a++){
b=b+d;
if(b*b==c){
break;
}
if(b*b<=c)
d=d*0.1;
}
printf(" %d の平方根は= %f ",c,b);
return 0;
}

243 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 11:21:53 ]
>scanf("%d",c);

244 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 11:27:04 ]
真に申し訳ございません。どうゆうこと?

245 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 11:30:23 ]
あああああああああああああああ
すいませんすいませんすいません!
もうしませんもうしませんもうしません!

246 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:22:54 ]
辞書検索の2分探索を下みたいに書いたんですけど、
????のところ(該当しなかった場合)が思いつきません。
助けてくださいです…

char a[20];
char b[20];
int hi,lo,i;



hi=i;
i=i/2;
lo=0;
while(1){
if(strcmp(b,a) < 0){
hi=i;
i=i-(hi-lo)/2;
}else if(strcmp(b,a) > 0){
lo=i;
i=i+(hi-lo)/2;
}else if(strcmp(b,a) == 0){
printf("あった");
break;
}else if( ???? ){
printf("そんなものなかった");
break;
}
}


247 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:30:21 ]
>>246
そこは if (lo > hi) を入れたいんだと思うが、
突っ込みどころが多すぎるからもうちょっと練り直して来い。

248 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:34:43 ]
せっかくなので1つ突っ込んでくだしあ

249 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:45:05 ]
if文の比較で最初の3通りのどれかに必ず含まれるから最後のelseは
絶対通過しない、まあelse外せばいいけど。
で、1ループでstrcmpは1回呼べばいいべ。
あと文字列が終わったのをチェックしないとね。
略の部分を略さないでテスト用に値設定したやつさらしてみてね。

250 名前:246と248 mailto:sage [2007/12/27(木) 14:55:46 ]
あ、ほんとだ。
ちょとまってください。



251 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 15:10:06 ]
#include <stdio.h>
int main(){
int i,j;

for(i=1;i<=9;++i)
printf("%2d ",i);
printf("\n--------------------------\n");

for(i=1;i<=9;++i){
for(j=1;j<=9;++j)
printf("%2d ",i*j);
printf("\n");
}

return 0;


for文の練習で書いた上の九九を表示するプログラムをwhile文だけで書けないかなぁと思って

252 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 15:10:38 ]
>>251の続き

#include <stdio.h>
int main(){
int i=1;

while(i<=9){
printf("%2d ",i);
i++;
}
printf("\n--------------------------\n");

i=1;
int j=1;
while(i<=9){
while(j<=9){
printf("%2d ",i*j);
j++;
}
printf("\n");
i++;
}

return 0;
}


このように書いてみたのですが1の段以降改行だけでプログラムが終了してしまいます
どうやったら上手く動かせるでしょうか

253 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 15:13:52 ]
>>252
jの値がどういう風に変化するか追ってみよう。


254 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 15:13:58 ]
>>252
while (j<=9) のループ抜けたらj を1に戻さないと。

255 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 15:20:50 ]
あーjが9のままだから次以降のループはスキップされちゃうのか
ヒントありがとうございました

256 名前:246他 mailto:sage [2007/12/27(木) 15:54:11 ]
せっかくレスくれたのに放置ですみません。
またあとで伺いにきます。

かしこ

257 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 16:38:48 ]
大学が決まって4月がで暇なのでC言語を勉強しようと思っているのですが

苦しんで覚えるC言語
ttp://homepage3.nifty.com/mmgames/c_guide/
というサイトを見つけたのですがこのサイトはどうでしょうか?

初心者にいいサイトや本を教えてください

258 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 16:56:00 ]
それでいいよ

259 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 17:31:45 ]
>>257
おk

260 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 17:37:17 ]
いいのかよw



261 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 18:13:44 ]
>>257
そのサイトはダメ出しされているよ。

262 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 18:33:23 ]
ダメ出しすれば著者を超えた気分になれるよね

263 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 18:40:27 ]
あんたは小石を跨いでも小石を超えた気分になれるのか?

264 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 18:54:03 ]
aho

265 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 18:57:48 ]
>>257
そのサイトで勉強すると、>19や>205みたいなことを書くようなお馬鹿になっちゃうよ。

266 名前:デフォルトの名無しさん [2007/12/27(木) 19:03:50 ]
>>257
参考になるけど、やっぱり本がいいよ。
独習Cとか、やさしいCね。

267 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 19:04:05 ]
どうなろうと後で矯正するからいいよ。

268 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 19:05:44 ]
まあ初心者はどのサイトから始めてもいいと思うけど、
そこに留まらずいくつかのサイトを回った方がいいよ
そして宿題スレで宿題を解く
ついでに簡単なデータ構造、アルゴリズムも学ぶ
こんな感じで基礎はおk

269 名前:デフォルトの名無しさん [2007/12/27(木) 19:09:25 ]
他のサイトを見るたびに、こんなやり方があったのか!
ってなって悲しくなるぞ。

270 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 19:37:32 ]
他のサイトを見るたびに、こんなやり方があったのか!
ってなって嬉しくなるぞ.



271 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 19:50:21 ]
特定のサイトにいついたことはないなあ
適当に検索して、
その日見つけたサイトをぱらぱらと読む
サイト規模にもよるけど1日ありゃ十二分に読み終われるとこばっかだし

272 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:08:52 ]
おれのお勧め、更新は止まってるけど・・・
mikata.curiocube.com/index.php

273 名前:デフォルトの名無しさん [2007/12/27(木) 20:10:38 ]
WisdumSoftでC言語の基礎文法を覚えて
(例文の内容にアニメ好きがかもしだされているが)
Programing Placeでデータ構造とかその他の
知識を学ぶ。
で理解できない所(ポインタとかかな)を重点的に
載せてる本でさらに学ぶ。
あとは、経験値をつけていくだけだ。

274 名前:273 [2007/12/27(木) 20:11:47 ]
間違えたWisdomSoftだ

275 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:02:21 ]
変数宣言と代入ってつなげられるんですか?

276 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:05:44 ]
>>275
いいえ、それは初期化です

277 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:10:49 ]
苦しんでわけわかめ
違うサイトで勉強するわ
お勧め教えてくだしあ

278 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:17:21 ]

猫でも解るって、ぶっちゃけどう?

携帯からサーセソw

279 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:21:20 ]
>>275
int i;
i = 0;
を指してるなら可能だし
int i=0;
なら>>276の言うとおり「初期化」という。

280 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:33:14 ]
初期化と代入はどう違うんですか?



281 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:36:05 ]
初期値を指定するのが初期化。

初期化と代入ではできることが違う場合がある。
配列は一気に全要素を初期化できるけど、
一気に全要素に代入することはできず、
1要素ずつしか代入できない、とか。

282 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:36:06 ]
const int x;
x = 1; //Error
//代入できNEeeee!!!

const int x = 1; //OK
//Yeah! 初期化最高!!

283 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:36:51 ]
>>280
ぜんぜん違う。初期化される前の値が何であるかは神のみぞ知る。

284 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:39:47 ]
以下の二つのコードで、
仮に最適化されないとするなら、
生成される機械語コードは同じですか?
それとも違う?

(1)
int array[2] = {1,2};

(2)
int array[2];
array[0] = 1;
array[1] = 2;

285 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:40:47 ]
コンパイラ次第

286 名前:284 mailto:sage [2007/12/27(木) 21:41:47 ]
すいません、ちょっと質問が悪いかも

初期化と代入は内部的に全く異なる処理をやっているんですか?
それともただ確保後に代入してるだけですか?内部的に。

287 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:43:53 ]
コンパイラ次第

288 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:44:59 ]
手元の環境で機械語コード生成してみればいいじゃん

289 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:48:46 ]
rep movsd 使って初期化してるかもしれないし、
mov で初期化してるかもしれないし。
そのあたりはコンパイラ次第としか言いようが無い。

290 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 22:22:17 ]
>>284
多分,全然違うコードになってる。



291 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 22:42:54 ]
>>284
>仮に最適化されないとするなら、
これが殆ど意味がないのでなんとも言えない。

292 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 23:45:59 ]
ってかマシン語レベルでの差なんて最適化どうこう言う前にコードが変われば変わる可能性はある。
空行(セミコロンのみの行)に対してNOPを吐くか消されるかだってコンパイラしだい。
予想でいいのならいくらでも応えられるけどな。

>>284のコードなら最適化関係なく同じコードが吐かれるかもね。

293 名前:デフォルトの名無しさん [2007/12/27(木) 23:55:28 ]
そんな事、気にしてたら禿げるぞ

294 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 23:58:41 ]
これ以上禿げたら腋毛が無くなる
びっくりするほどなくなる

295 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 00:17:48 ]
機械語レベルを気にする必要があるくらい禿てたら手段くらい知ってるだろ

296 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 01:40:46 ]
代入と初期化の違いは配列やれば判るよ
配列の初期化はOKだけど配列全体の代入はNG
なんでえ〜?ってのはポインタやると判る

297 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 02:13:30 ]
Java厨です。

プロトタイプ宣言ってなんですか?
C言語ってなんで関数を使う前に宣言しとく必要があるんですか?
昔ながらの慣習みたいなものですか?
宣言無くてもコンパイル通るなら、
コンパイラの手抜きと違うんですか?
関数宣言がないときと宣言も定義もないときと
ちゃんとコンパイラは違うエラー出しますよね?

298 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 02:26:15 ]
適度に手抜きしてくれないとコンパイルに時間がかかってしょうがないじゃないか

299 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 02:41:53 ]
分割コンパイルしないなら無くても良いんじゃない?

300 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 02:49:42 ]
C始めて3日くらいです
fopenとfcloseの使い方がようやく分かって、ポインタについては良くわかりません(変数の代わりなのかな?くらい
そこであるテキストファイルを開いて、その中にある文字列(英数字)からある文字列(setofなど)を探したいです
最終的にはある文字列が見つかる→その後ろ〜〜バイト(もしくは〜〜行)をコピーして、別のファイルにペースト というところまでやりたいのですが
検索しようとしている時点で詰まっています。ソースコードは以下です

#include <stdio.h>
#include <conio.h>
#include <string.h>
#define BUFFER_SIZE 200

main(){
       char buffer[BUFFER_SIZE],name[BUFFER_SIZE];
     FILE *fp;
      printf_s("test.txtを開こうとしました\n\n\n\n");
fp = fopen("test.txt", "r");
printf_s("検索文字列を代入してください\n");
scanf_s("%s",&name);
printf_s("%sを検索しています\n",name);
if ( !fp ){
printf("ファイルオープンエラー\n");
return 0;
}

while( fgets(buffer, BUFFER_SIZE, fp) ){
if(!strcmp(name,buffer)){
printf_s("%sが見つかりました!\n",name);
break;
}
}
fclose(fp);
}



301 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 02:54:03 ]
以上のソースに対して、テキストファイルを用意します
『aaxaa        ←改行
bbxb         ←改行
cxc【EOF】』
すると、cxcを入力しても反応してくれず、strcmpのところでcxc\nに変更すると、ifの見つかりました文が出ます
コレに対する問題点としては
1.改行まできっちり一致しなければ見つからないことになる
2.bbxbで完全一致であるが、bxbでも部分一致で見つかったことにしたい
  しかし、今では1行読み込みのために不可能(BUFFER_SIZEを実数にしても無理)

というところです
〜〜の関数使ったほうがいいよ、とか、こういうルーチンで考えるとできるよ、っていうのがあればお願いします
わかりにくい質問で申し訳ありませんが、宜しくお願いします

302 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 02:55:05 ]
>>300-301
strstr()

303 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 03:02:33 ]
>>302
ありがとうございます。今色々なページを見てきたのですが…
返り値としてポインタとして返すんですね。ポインタと見た瞬間に顔が引きつったのですが…

void TestStrStr(void)
{
char *s1 = "abcdef";
char *s2 = "de";
char *cp;
cp = StrStr(s1, s2);
printf("'%s'の中に現れる'%s'という文字列は%d文字目にある.\n", s1, s2, cp - s1 + 1);
}

このようなソースを見つけました。printfの一番後ろにあるcp-s1+1はおそらく何文字目にあるか指定してくれてるようなのですが
ポインタ同士を引き算しているこのような場合、実数として計算をしているのでしょうか?


304 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 03:13:28 ]
>>303
メモリアドレスを計算している。s1が100番地に格納されているとすると、メモリ上は
100 101 102 103 104 105 106 (メモリアドレス)
  a    b    c    d    e    f     \0
のようなイメージ。

strstr()は、見つかった部分のポインタを返すから、"de"を見つけたならアドレス103を返し、それをcpに代入している。
printf()の最後の引数はcp - s1 + 1、つまり103 - 100 + 1で4を返す。

305 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 03:23:02 ]
>>304
なるほど。だからポインタは便利だって言われてるんですね…メモリ上の一番基礎になる数字を返すから…
ありがとうございます
もうちょっとポインタのこと勉強してからやってみます。とりあえず今日は寝ます
ありがとうございました

306 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 03:26:31 ]
>>305
すまん、ちゃんと質問読んでなかったw

ポインタは「アドレスという数字」を格納する変数。
アドレスと聞くと拒否反応が出るかもしれないが、メモリ上の位置を表す何の変哲も無いただの数字。
ただし、四則演算のうち可能なのは加算減算だけで乗除は出来ない。やっても意味のある数字が得られないから。
正しくはインクリメント、デクリメントだけど、これについての詳細はググってくれ。

307 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 04:18:50 ]
ポインタやる時はメモリマップ作って見ると良いよ
スタック、データ、コードのそれぞれのセグメントがどんな配置か判っているとポインタの理解が早くなる

308 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 07:55:49 ]
>>306
ちょっとだけ語弊がありそうなので補足。

・ポインタ+整数 → n 要素だけすすめたポインタを算出
・ポインタ−整数 → n 要素前のポインタを算出

これは可能。ただし配列とか malloc で用意してある範囲を逸脱しないように注意。

・ポインタ−ポインタ → 2つの要素の差を整数で算出

なんだけど、この場合2つのポインタは同じ範囲を指すもの
(304みたいに同じ文字列内の違う位置を指すように)
でないといけないから注意。

309 名前:デフォルトの名無しさん [2007/12/28(金) 08:31:18 ]
アドレスは「符号なし整数には似ているけど、全く違う種類のデータ」だと考えた方がいい。
整数なら四則演算が定義できるが、アドレスの場合は>>308の言う通り。

そしてインクレメント/デクレメントなんかは「アドレスと整数の混合演算」だと思えばいい。

C言語ではデータの種類によって専用の型を用意するから、整数はintやlong、アドレスは
ポインタを使うと思っておけばいい。

310 名前:Google先生 mailto:sage [2007/12/28(金) 10:17:12 ]
インクレメント に一致する日本語のページ 約 1,940 件中 1 - 10 件目 (0.20 秒)

もしかして: インクリメント



311 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 11:01:26 ]
インクリメント デクリメント の検索結果 約 20,700 件中 1 - 10 件目 (0.05 秒)
www.google.co.jp/search?hl=ja&q=%E3%82%A4%E3%83%B3%E3%82%AF%E3%83%AA%E3%83%A1%E3%83%B3%E3%83%88%E3%80%80%E3%83%87%E3%82%AF%E3%83%AA%E3%83%A1%E3%83%B3%E3%83%88

インクレメント デクレメント の検索結果 約 544 件中 1 - 10 件目 (0.34 秒)
www.google.co.jp/search?hl=ja&q=%E3%82%A4%E3%83%B3%E3%82%AF%E3%83%AC%E3%83%A1%E3%83%B3%E3%83%88%E3%80%80%E3%83%87%E3%82%AF%E3%83%AC%E3%83%A1%E3%83%B3%E3%83%88

検索結果を見ると、インクレメント/デクレメントと読む人もいるようだ。

312 名前:デフォルトの名無しさん [2007/12/28(金) 12:52:57 ]
まったく…
K&Rに何と書いてあるか読んでから出直して来い。

313 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 14:10:56 ]
英語で書いてあるな

314 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 20:14:54 ]
英語のカタカナ表記を議論することほど無意味なものはない。
ただ、そのあたりを議論したくてしょうがない馬鹿よけ対策として、
市民権のある表現を使うに越したことはない。

315 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 20:26:25 ]
D→デー
T→テー

と発音するベテラン技術者に食って掛かる新米社員を思い出したw

316 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 22:39:56 ]
>>299
相互再帰する必要がある時はないと困る。

317 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 22:42:44 ]
>C言語(シー言語)は、1972年にAT&Tベル研究所のデニス・リッチー (Dennis M. Ritchie) が主体となって作ったプログラミング言語である。

1972当時のマシンでJava並みのコンパイラやアプリなんて起動すらしねぇw

318 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 22:48:55 ]
おまえは何を

319 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 16:41:33 ]
テキストエディタ(メモ帳)で、ソースファイルを作ったのですが、
どこのファイルに保存すればいいのか、全く分かりません
どなたか宜しくお願いします

320 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 16:43:14 ]
自分で決めた場所に自分でフォルダ作って保存しとけ



321 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 16:44:42 ]
               .|  
               .|  
    ∩___∩    |  
    | ノ\   ,_ ヽ  .|  
   /  ●゛  ● |   .J  
   | ∪  ( _●_) ミ 
  彡、   |∪|   |     
 /     ∩ノ ⊃  ヽ
 (  \ / _ノ |  |
  \  "  /  | |
   \ / ̄ ̄ ̄ /
      ̄ ̄ ̄ ̄

322 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 16:44:53 ]
マイドキュメントとかに置くとスペースがどーたらではまるから
c:\homeとかc:\srcとかってディレクトリを作ってそこに置け。
コマンドプロンプトを起動したら
cd /d c:\home
と打ってそこに移動してコンパイルしろ。

323 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 16:58:31 ]
なんか、自分の手違いがあるらしく、「:や¥は、ファイル名には使えません」
と出てしまいます・・・  
どういうことなのでしょうか・・

324 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:00:48 ]
プログラム以前の問題。
Windows のことをもうちょっと勉強しる。

325 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:01:43 ]
:や¥はファイル名に使えるがなんて冗談は置いといて

>>322のはディレクトリ(フォルダ)名

326 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:08:10 ]
Windowsキー+Rでcmdを起動
以下を入力
mkdir c:\home
cd /d c:\home
explorer /n,/e,c:\home
notepad hello.c
gcc hello.c && a.exe

327 名前:デフォルトの名無しさん [2007/12/29(土) 17:11:14 ]
beginthreadexに複数の値を渡すコードがわからないのですが、
教えて下さい。

328 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:12:12 ]
>>327
msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vclib/html/_crt__beginthread.2c_._beginthreadex.asp

329 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:41:23 ]
何日くらいでマスターできますか?

330 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:44:59 ]
>>329
何を?C?
あんたの今のCの習熟度、他言語について、PCに関する一般知識がどの程度のものか



331 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:48:06 ]
>>330
Cですね
今日はじめた。他言語まったくしらない。PC知識まぁまぁ。

332 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:49:42 ]
1000日くらいがんばれ

333 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:50:13 ]
どの程度を「マスター」と言うのか分からんが、
一通りどんな感じなのか知るのに2ヶ月、
それなりに使えだすのに半年、
十分使えるまでには1〜2年くらいじゃね。

334 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:52:24 ]
がんばるよ

335 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:59:35 ]
C言語の「マスター」と言うと、
・ANSI前(K&R?)の仕様とC89、C99の規格に精通している
・代表的なコンパイラのオプションと処理系定義の仕様が概ね分かる
・上記コンパイラの最適化の仕様がある程度分かる(要アセンブラ?)
代表的なコンパイラ:gcc、VC、BCCぐらい?組込みだとその他もか

辺りだと思うんだがどーか。

336 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 18:00:37 ]
Linuxカーネルをビルドできたらスーパーハカーです

337 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 18:04:53 ]
>>335
実務的な知識がなさすぎるだろう

338 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 18:05:49 ]
コンパイラマスターだな

339 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 18:17:55 ]
とりあえず正月つぎ込んで入門書読破すりゃマスターしたってことでいいよ。

340 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 18:25:23 ]
>>335
・Cコンパイラ書いた事がある。



341 名前:323 mailto:sage [2007/12/29(土) 18:55:56 ]
なんとか意味を理解したつもりで、プログラムの実行段階まで来たのですが

#include <stodio.h>

int main()
{
printf("Hello World!\n");
return 0;
}

のようなソースファイルを実行したらエラーがでました・・・
どこがまずいのでしょうか

342 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 18:58:03 ]
stodio.h
エラーメッセージ嫁

343 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 19:01:51 ]
stodio.h

344 名前:323 mailto:sage [2007/12/29(土) 19:03:08 ]
>>342
どうもすみません
なんとか成功しました! やはり実践しなければ分かりませんね

345 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 19:26:08 ]
このすっとこどっこいアイオー

346 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 19:30:49 ]
>>341
ごめん、僕も極最近始めたものだけど、stodioには吹いたw
一緒に頑張ろう!

347 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 19:37:51 ]
studio とかはたまに見かけるな。

348 名前:デフォルトの名無しさん [2007/12/29(土) 19:56:49 ]
stdioも見るな

349 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 20:04:24 ]
cstdioも見る。

350 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 20:58:54 ]
>>345
お茶吹いたw



351 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 22:25:47 ]
みんなどのくらいの年齢でC言語始めるんだろうか
もしかして今の商業高校とかでは教えられているのか?

352 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 22:40:37 ]
>>351
商業の基本は情報処理だが、
俺のとこじゃ国家試験の勉強が中心
だが、商業でVBをやるところもあったし、JAVAをやるところもある。

353 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 23:19:04 ]
oshiete1.goo.ne.jp/qa3021719.html
この中の
lpPARAM lpParam = (lpPARAM)lpx;
はどのような意味を持っているのですか?

354 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 23:26:40 ]
>>353
元の関数仕様が void* だから
渡す側が lpPARAM をvoid*にいれて
とりだす側がキャストで戻してる

355 名前:デフォルトの名無しさん [2007/12/30(日) 00:05:56 ]
C言語ってポインタとか使うメリットあんの?って感じだけど
難しいから使わなくても大丈夫かな?

356 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:08:16 ]
>>355
その内必要になる時がくる

357 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:15:13 ]
>>355
ポインタのメリットをすぐに理解する必要はないが,必要になったときにすぐに(少し調べて)使える程度に覚えとけ

358 名前:デフォルトの名無しさん [2007/12/30(日) 00:17:59 ]
ok
いま独習Cでポインタやってるんだが、まぁある程度理解してるんだが
少し、上に行くと難しいんだよな。
char *bokki ="ちんこが立つ";

printf(bokki);
って場所やってるぜ、こういうのってプロでも使うのか?

359 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:19:36 ]
>>255
使うメリットが無い内は使わなくていいと思うよ
便利だから使うのであって、かつC言語をやっていればそのうち「これはポインタを使った方が楽だ」って状況が出てくる
その時に使えばいいだけの話


まあC++ならまだしも、C言語だと関数との配列の受け渡しとかで
すぐにポインタが必要な状況になるよ

360 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:20:34 ]
>>355
同じアドレスを共有したいときがあるのさ
夫婦だって別々のベッドじゃいやだろ?



361 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:22:17 ]
>>358
まぁリテラル文字列はstaticでconstで領域もconstしちゃうけど

362 名前:デフォルトの名無しさん [2007/12/30(日) 00:22:19 ]
Cは難しいなポインタが
もしかして359と360はバリバリ使えるんすか?

363 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:23:39 ]
>>358
const char * str = "俺童貞";
printf("%s", str);

まあdefineの代わりにconstポインタを使うことはあるかもね
defineの代わりとしては
const char* const str = "ヤリてー";
の方がいいかね

364 名前:デフォルトの名無しさん [2007/12/30(日) 00:25:40 ]
すごいっすねみなさん
この頭の良さを駆使して、みなさんが作ったプログラムはどんなのありますか?
実用的で使えそうなやつっすよタブを消したり入力した文字をソートしてなんたらしたり

365 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:26:20 ]
>>358
表示したい文字列に%があると見落とすかもよw

366 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:28:41 ]
宇宙に浮かんでるアレの制御プログラム、を作るための支援ツールとか監視システムとか

367 名前:デフォルトの名無しさん [2007/12/30(日) 00:29:31 ]
ちなみに私が作ったのは
1,暗号化 2,解読 3,Quit
というやつでシーザー暗号に似た奴ですね。
まだまだへたれですよ


368 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:29:59 ]
文字列のポインタは文字列の実装上使わざるを得ないのでメリットが分かりにくいと思う

369 名前:デフォルトの名無しさん [2007/12/30(日) 00:30:44 ]
>>366
本気で言ってるんすか?
知人の凄い人でもATMなのに人工衛星とかの制御プログラムとか次元が違いすぎる

370 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:32:40 ]
最近、どっかの団体のコーディングルールとか見ると、ポインタの演算禁止とか、
ポインタのポインタらしい使いかたはしないって流れになってきてるな。
じゃPascalでも使ってればいいのにって気がするけど。



371 名前:デフォルトの名無しさん [2007/12/30(日) 00:32:54 ]
ポインタがどうでも良くなってきたんで。
早くファイル操作などの場所をやりたいんですが、ページを飛ばすと複雑な気持ちになるので
ポインタのページと関数のページを仕方なくやりますか

372 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:33:22 ]
>>369
よく嫁
支援ツールだ
つまりだたの社内ツール

373 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:34:43 ]
実用的なのは作ったこと無いな、所詮娯楽用品止まり。

374 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:35:23 ]
私の書いたコードなら、世に出回っているフラッシュメモリのシェアの多くを生み出す装置の検査に使われているぜw

375 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:35:35 ]
まぁ日曜プログラマならそれでいいんじゃね?
自分の腕を仕事に活かしたいと思ったら、それはそれで地獄をみることになるし

376 名前:デフォルトの名無しさん [2007/12/30(日) 00:35:54 ]
>>372
でもすごいっすよ
C言語を始める時期が悪かったですかね
ガキの頃に手をつけとけば良かったと後悔しますよ
Cをマスターしたら次はperlかjavaやろうかと思ってるんすよ

377 名前:374 mailto:sage [2007/12/30(日) 00:36:39 ]
もっと身近なところでは、某駅ビルの駐車券発行機に使われているとか(ぉぃ

378 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:40:35 ]
去年一年くらいCの仕事をやって、医療関係のシステムだったけど、ありえないくらいコードの質が
低かったから、そのシステムを導入してる病院には行かないことにしてる。怖い。

379 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:40:58 ]
>>376
始めるのに早いも遅いもない
逆にガキのころはガキのころにすべき勉強なり体験なりをしなくちゃいけない
Cなんてただの道具にすぎんのですよ、偉い人にはそれがわからんのです

380 名前:デフォルトの名無しさん [2007/12/30(日) 00:41:44 ]
>>374
まじすか?
凄過ぎますよ、是非そういう人に基礎から教えてもらいたいんですが
まぁ無理なんでしょう、自力でやらないと意味がないし
そういうコードを書くにはCを学んでいたときに1日どのくらい書いてましたか?
あとは1日3個適当にプログラムを作るとかそういう目標とかってありましたか?

>>2373
私もそんな感じっすよ
暗号化できたーやーいって(自己満)すよね

>>375
プログラマーになったら大変そうすよね
それで食ってくのは難しいすよね



381 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:44:56 ]
プログラミングの仕事は中国やらインド勢力に取られていくし、
自動生成の流れが盛んになってきているから、
プログラミングの仕事はどんどん減っていくだろうね
現に、カードにパンチしていた時代はコーディングが開発工程の8割を占めていたのに、今では2割程度

382 名前:374 mailto:sage [2007/12/30(日) 00:46:50 ]
そう言えば某社のFAXに……あれはアセンブラだったな。
某社の検査装置に使われているのは……basicか。

てな具合にいろんな時期にいろんなことをやっていたから「Cを学んでいた(だけの)とき」なんてないよ。

383 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:47:00 ]
娯楽用品って言っても仕事なんだけどな (´・ω・`)

384 名前:デフォルトの名無しさん [2007/12/30(日) 00:48:11 ]
>>381
今の日本は開発よりかも指示とかプロジェクトの提案とかそんな感じすかね?
たしかにインドとか中国はすごいっすよね。
ロシアは凄いらしいですがどうなんでしょう。
生まれる場所を間違えたな・・・



385 名前:374 mailto:sage [2007/12/30(日) 00:48:52 ]
>>381
あー確かに、カードパンチの時代は「完全なる机上コーディング」をしたものを「パンチするだけ」だったな。
# 流石に学校で体験しただけだが

386 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:50:47 ]
NHKのワーキングプアの番組でやってたな。
アメリカで銀行のシステムをやって年収1000万のIT技術者が、インドに仕事とられてファーストフードの店でアルバイト。


387 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:53:08 ]
別にインドや中国が凄いってわけじゃなくて、単価が安いからそっちに簡単な仕事まわしてるだけだよ
難しい仕事は単価の高い日本で集中的にやる


388 名前:デフォルトの名無しさん [2007/12/30(日) 00:53:59 ]
やっぱ裕福な国は、それ以上求める物が無くて開発するレベルが低いんですか?
日曜プログラマが良いかな、本職は他ので。
パソコン詳しいねすごいねおっちゃんって言われればそれでいいかな

389 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:57:27 ]
>>387
これからはインド人や中国人の10倍の価値のある技術がないときびしいだろうね。

390 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:01:40 ]
>>388
日本を舐めすぎw
おまい、マスコミに変に影響されてるな
プログラミング力のあるなし以前に、視野の狭さが心配だよ

コーディングっていうのは単純作業なんだよ、単純作業
町工場で働く工員と同じ
指示されたものを淡々と作るだけ

じゃあ、それ以前に何をどう作るか、ってのを考えなきゃいけないよね
それを考えるのが日本の仕事

もちろん、今後すぐにプログラミングの仕事が無くなるわけじゃない
やっぱり言語や文化の壁があって、オフショア開発の管理って難しいくて、
リスクを極力避けるために、
現状は、仕様変更の激しい部分とか、重要な部分ってのは日本でコーディングしてる



391 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:03:10 ]
C/C++でポインタを使わないプログラミングが想像できない

>>380
1日3個も作れるならそいつは天才か、作ったものがゴミ箱行きのカスか

392 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:06:13 ]
とりあえずLinux上の適当なコマンドのソースでも読んでろ

393 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:08:05 ]
UNIXコマンドのソースは俺も読んだなあ。

394 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:10:12 ]
おまいはいいよ

395 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:14:42 ]
ライブラリの○○.aっていうファイルから
収録してある関数名を取り出すことって可能ですかね?
あったら教えてください

396 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:22:21 ]
>>395
nmコマンドでぐぐれ

397 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 02:32:38 ]
>>391
C++ならiteratorは別とすればポインタつかわないこと多くね?

398 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 04:17:57 ]
Java厨です。
Include文とかヘッダファイルの自動生成って出来ないもの?


399 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 05:06:09 ]
条件にもよるが不可能では無い
頑張って作ってみれば?

400 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 07:46:20 ]
>>396
どうもありがとうございました。



401 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 08:24:40 ]
#define DATA "data"
と、例えば定義してexeを作ったときバイナリエディタでみても"data"を文字列として見つけられません
これはどういう形で格納されていのでしようか?

402 名前:デフォルトの名無しさん [2007/12/30(日) 08:26:04 ]
たとえば、
#define SRAM_A (volatile unsigned char *)0x200000
こんなのもポインタを使っているといっていいですか?
SRAM.Hの中身は、こんなのだらけなんですけど。

403 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 08:33:50 ]
>>401
DATAを作っていなければコンパイラはobjに"data"を出力しない。
当然、出力されるEXEにも存在しない。

404 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 08:54:40 ]
>>402
それだと「アドレス」と言いたくなるけど、まぁポインタだね。

405 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 08:58:09 ]
>>402
組み込みなら普通は #pragma で section 名指定して、
リンカーで配置する。処理系によって違うけど
似たようなコードがあるはず。

絶対アドレスにポインタ使う必要なし。


406 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 13:24:24 ]
趣味でGBAやったときも402みたいなことばかりやったな。

407 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 14:42:25 ]
こんなマクロ定義してたな俺。
#define Acc08(Adr) (*(volatile unsigned char *)Adr)
#define Acc16(Adr) (*(volatile unsigned short *)Adr)
#define Acc32(Adr) (*(volatile unsigned int *)Adr)

408 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 14:50:02 ]
DOS 時代も VRAM 使う時にそういう事してたな。

409 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 17:04:38 ]
>>401
そもそも使ってなければプリプロセッサはコンパイラに"data"を出力しない

410 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:17:27 ]
void *myMalloc(int size)
{
void *p;
p = malloc(sizeof(double) * size);
if (p == NULL) ...エラー処理;
return p;
}
と言うような関数を作ったのですが、

これに、double **a の奴と、 double *b に
a = (double **)myMalloc(size);
b = (double *)myMalloc(size);
と、つなぎ合わせる事をするのですが、
特にこれで問題は起こらないものでしょうか?



411 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:32:56 ]
>>410
何かメモリがもったいないな

412 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:48:21 ]
a = (double **)myMalloc(size);
のあとは、for文回して
a[i] = (double *)myMalloc(size);
と言うふうに、2次元配列を作る予定なんですが・・・

413 名前:デフォルトの名無しさん [2007/12/30(日) 21:51:23 ]
すみません、質問させてください。
テキストファイルを作ると同時にそのファイルから文字を読み込んで出力する・・というのをやりたいのですが、なぜか開こうとしてもすぐ画面が消えます。なにがいけないんでしょうか?
別に読み込むだけでもいいのでアドバイスお願いします。コンパイラは「Bloodshed Deb-C++」です。

414 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:52:39 ]
改行が多すぎると言われたのでいくつかに分けて書きます。
#include <stdio.h>
#include <stdlib.h>
void kaku(int,int*,char*);
int main(int argc, char *argv[])
{
int ten=0;
char kekka[]="NG";
kaku(1,NULL,NULL);
kaku(2,&ten,kekka);
kaku(3,NULL,NULL);


415 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:53:27 ]

FILE *fp;
char data[256];
fp=fopen("test,txt","r");
fscanf(fp,"%s",data);
fclose(fp);
printf("%s\n",data);
system("PAUSE");
return 0;
}

void kaku(int fg,int *ten,char *kekka)
{
static FILE*f;
switch(fg){
case 1:
f=fopen("test.txt","w");
break;
case 2:
fprintf(f,"%d点,",*ten);
fprintf(f,"%s\n",kekka);
break;
case 3:
fclose(f);
break;
}
}
です。長々とすみません

416 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:59:38 ]
>>412
pointer to pointerを作るなら
a = (double**)malloc(size*sizeof(double*));
じゃないの?
まあ、メモリは余分に確保されてるからコーディング間違えなければちゃんと動くだろうけど。

>>413
意味が分からない

417 名前:416 mailto:sage [2007/12/30(日) 22:01:23 ]
ああ、>>413>>414-415

418 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:06:43 ]
>>416
printf("%d\n", sizeof(double));
printf("%d\n", sizeof(double *));
で確認した所、 double型が8で、double *型が4でした。
ポインタだと値が違うんですね。 始めて知りましたorz

通りで動かなかったのかと・・・ 
ありがとうございました。 頑張ってみます

419 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:16:23 ]
>>413-415
13行目はtest,txtじゃなくてtest.txtだろう。
fopenしたならfpがNULLかどうか必ず確認すべきだ。
system("PAUSE")というのは俺の環境にはなかったから外したら多分期待通り動いた。

420 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:37:38 ]
>>419
できました!ありがとうございます!!



421 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 01:54:34 ]
>>418
ついでにcharとchar *、shortとshort *とかもsizeofして見比べて見ると良いよ
ポインタがちょっと見えて来る

422 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 01:55:08 ]
テキストファイルからある文字列を検索し、ヒットした文字列の直後にある数値を抜き出すコードを考えています
例えば
X= 630.20 Y= 220.20
Z= 33.25 A= 30.25
のような感じです。このうちプログラム内で定数として用いたいのが630.20や220.20、33.25に30.25です
まず1行目をfgets()でポインタ*fpに読み込んで、"X="をstrstr()で探します
その辺りまでしかぱっと思いつきません
ここから630.20を読み込もうと思うと、どのような方法があるでしょうか
宜しくお願いします

423 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 01:56:18 ]
scanf

424 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:01:46 ]
>>423
ありがとうございます
ですが、scanfはキーボードから入力したデータを読み込む奴ですよね?
テキストファイルに書いてあるものを読み込みたいのですが…

425 名前:デフォルトの名無しさん [2007/12/31(月) 02:15:45 ]
isdigit() 一文字ずつで調べて配列に格納して、atof() とか
トークンがスペースなら、そこまで読み込むようにして、 atof() とか

トークンをもう少し考えなおすのがいいかも、セミコロン、カンマとかにする。
strtokn()とかあった気がするが、それは調べてくれ。

426 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:22:41 ]
>>424
fscanf

427 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:24:37 ]
>>425
変なこと教えるなよ。
atofは数字以外に当たったら解析を終了するから、
> 一文字ずつで調べて
とかは不必要だろ。

428 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:29:10 ]
>>425
ありがとうございます。isdigitでチェックして配列に格納が簡単そうですね
strtokn()もありますけど、元ファイルを変換する(というより、別ファイルを作ってそこに数値同士をカンマ等で区切るようにする?)ので、あまり使いたくないところです
最悪、strtokn()で別ファイルを一時ファイルとして作成してやるという方法がありますが…
ちょっと考えてみます。ありがとうございました

>>426
fscanfにそんな機能があったのですか、もう一回調べてきます
ありがとうございました

429 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:54:39 ]
>>428
scanfはfscanfのラッパー関数みたいなもん。
scanf内でfscanfをstdinに対して処理している。
scanfでもstdinをfreopenすればファイルからの入力にできる。

430 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 09:13:36 ]
普通strtol(), strtod()



431 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 09:43:21 ]
#include<stdio.h>
int main ()
{
int a,b,c,i,f,d[50];
scanf("%d %d",&a,b);
switch(a*b){
case 0:
return 0;
defalt:
c=a/b;
printf("%d",c); /*19*/
break;
}
i=1;
while(i<=50){
c=a%b;
d[i]=c/b;
c=c%b;
printf("%d",d[i]);
if(d[i]==0)
f++;
else
f=0;
if(f>=2)
break;
i++;
}
return 0;
}
スミマセン!なんでコレダメなのデスカ?オシエテクダサイ!!!

432 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 09:45:12 ]
>>431
scanf("%d %d",&a,&b);
反射神経が書いてるので違うかもシレン。

433 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 10:26:48 ]
>>431

defalt:

↑これがだめだ。
ラベルとして認識しているはず。
default: な。


434 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 10:28:32 ]
>>431

ちょっとずれるが、

switch(a*b){
case 0:

↑0かどうか判断したいだけなら、if文を使うべきだ。
switchにする必要なし。


435 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 12:42:18 ]
スミマセンちなみにエラーの内容ハ”Ifに(がナイ”デス。
修正しまシタがダメデス。
書き方ノドンクササとかよりそっち教えてホシイデス。

436 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 13:03:01 ]
>>431に「エラー」は見当たらないような・・・

437 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 13:18:59 ]
>>435
もう一回、ifの入ってるバージョンのソース見せてくれたらなにかコメントできるかも

438 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 13:22:45 ]
>>431
>d[50];

>i=1;
>while(i<=50){

これも駄目だな

439 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 14:25:34 ]
437
このトウリデス
ナオラネエ!ウガァァァァァ

440 名前:デフォルトの名無しさん [2007/12/31(月) 17:09:50 ]
#include <stdio.h>
void test(int i);

itn main(void)
{
test(0);
return 0;
}

void test(int i)
{
if(i<10){
test(i+1);
printf("%d",i);
}
}

再帰なんですが
これ難しくて理解できないんすよ。
みなさん詳しく説明してくださいお願いします。



441 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 17:41:00 ]
test関数は引数が10未満ならもう一度test関数を引数+1の値を使って呼び出したあと引数を出力する。
出力は「9876543210」ってなるだけかな?
10を3とかにして流れをゆっくり追って行けばわかるよ。


442 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 17:42:04 ]
itnってなんだろうってのは置いといて、

test(0)は0+1でtest(1)を呼ぶ
test(1)は1+1でtest(2)を呼ぶ
最終的にtest(9)が9+1でtest(10)を呼ぶが、i<10じゃなくなるので何もしない
その後printfで9が印字され、8が印字され・・・最初の0が印字されて終了と
処理が戻っていく感じだな

443 名前:440 [2007/12/31(月) 18:03:00 ]
>>441 >>442
やっぱ再帰できたほうがいいすか?
ポインタよりも再帰の方が難しい・・・



444 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:04:52 ]
何が難しいのかさっぱり理解できない

445 名前:440 [2007/12/31(月) 18:11:48 ]
何故、0123456789じゃなくて
逆になるのかが、難しい


446 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:13:21 ]
>>443

感覚的に理解できないだけだと思うけど、
デバッガでステップ実行して追っていけばわかると思うよ。

ちなみに、再帰はめったに使わない。
11年ぐらい仕事でCプログラミングやってるが、
再帰を使ったのは1,2回。

447 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:23:52 ]
>>445
printfを実行するのはtestを実行した後だから

ディレクトリの走査とかそれに類似したものは再帰使うなぁ
定番というか

448 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:30:32 ]
デバッグ中に無限に再帰してスタック食いつぶしてデバッガがフリーズするのも良い思い出。

449 名前:440 [2007/12/31(月) 18:56:37 ]
再帰なんて深く理解しなくていいすか?
適当にながしちまえば?

450 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 19:01:59 ]
じゃあこれでどうだ

int sum(int n)
{
    int ret;
printf("enter sum(%d)\n", n);
    if(n == 1)
        ret = 1;
    else
        ret = n + sum(n - 1);
printf("leave sum(%d)=%d\n", n, ret);
    return ret;
}

int main()
{
    printf("sum(5)=%d\n", sum(5)); // print 1+2+3+4+5
    return 0;
}

enter sum(5)
enter sum(4)
enter sum(3)
enter sum(2)
enter sum(1)
leave sum(1)=1
leave sum(2)=3
leave sum(3)=6
leave sum(4)=10
leave sum(5)=15
sum(5)=15



451 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 19:04:18 ]
>>449
何を目的で勉強してるかによるんじゃないかな
単位のためとかであれば流しちゃっていいと思う

452 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 19:05:08 ]
滅多に使わないけど、再帰は階層構造を簡単に処理するには非常に便利、
この程度の基本テクニックにねを上げてるようじゃ、先は暗いよ。
諦めずに理解するべし。




453 名前:440 [2007/12/31(月) 19:11:11 ]
>>452
理解してみます
再帰はソートっぽいんすね
>>451 >>452とか
他の人たちは
socketとかネットワークプログラムとかもへっちゃらすか?


454 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 19:18:10 ]
「へっちゃら」の意味合いによる
ネットワーク関連のバグの修正とかは泣きそうになる

455 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:23:41 ]
スタックはLIFO

456 名前:440 [2007/12/31(月) 22:31:02 ]
test(0);


printf("%d",i);
tesxt(i+1);
の逆の再帰だと理解できます
先にprintfで0を表示してそのあとにtest0+1をして
1になってprintfで1を表示して
それを10まで繰り返すんですが

上の440のやり方だと
なぜtest(i+1);したあとprintfをやっているのに 9が最初にくるかがさっぱりなんですが
より詳しく教えてくれる人はいませんすか?

457 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:42:02 ]
>>456
再帰呼び出しが終わったらどこに戻るか考えてみそ。

458 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:44:11 ]
長いのでi<2でやると
test(0)→test(1)→test(2)→2は何もしないのでそのまま終了
test(1)に戻る、printf("%d",1)、test(0)に戻る→printf("%d",0)
return 0;に戻る

459 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:45:23 ]
10まであると面倒だからif(i<10)のところがif(i<2)だったものとする。

test(i+1)の所に順次、関数の中身を展開していくと、

if(0<2){
if(1<2){
if(2<2){
test(2+1); // ここは実行されない。
printf("%d",2); // ここは実行されない。
}
printf("%d",1);
}
printf("%d",0);
}

になる。で、10が表示される。これ見たら分かる?

460 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:45:46 ]
>>456
たぶん他の人と被ると思うけどw

test(0) が呼ばれるじゃん?
→ i<10 なので、test(1) が呼ばれるじゃん?
 → i<10 なので、test(2) が呼ばれるじゃん?
   : 中略するじゃん?
    → i<10 なので、test(9) が呼ばれるじゃん?
     → i<10 なので、test(10) が呼ばれるじゃん?
      → i<10 が成立しないので、何もせずに test(10)を抜けるじゃん?
     → printf("%d", 9) で 9 が出力されるじゃん? そんでtest(9)を抜けるじゃん?
   :
 → printf("%d", 2) で 2 が出力されるじゃん? そんでtest(2)を抜けるじゃん?
→ printf("%d", 1) で 1 が出力されるじゃん? そんでtest(1)を抜けるじゃん?
printf("%d", 0) で 0 が出力されるじゃん? そんでtest(0)を抜けるじゃん?
main() 終了じゃん?

さあ、何が出力されたかな?っと。



461 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:46:56 ]
3人もかぶるとはめずらしい

462 名前:460 mailto:sage [2007/12/31(月) 22:47:32 ]
ほら被ったあw

463 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:50:36 ]
おまえら大晦日なのに暇人だな



いや大晦日だから暇なのか

464 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:52:11 ]
初詣に出かけるまでの時間、暇で暇で仕方ない

465 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:53:14 ]
休みなんて、コーディングくらいしかやること無いしね

466 名前:440 [2007/12/31(月) 22:57:43 ]
おお!わかりやすいです。
ですが何故、繰り上がってる時にprintfが有効にならないのかが不思議です

i<10 test(0);

test(1)に繰り上がる時は test(i+1)とprintf("%d",i);をやるはずなんですが

何故printfが飛ばされてるんですか?

467 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:59:42 ]
test(i+1)が終わらないとprintfに進めないじゃないか。

468 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:59:50 ]
わかってないのにわかりやすいとはこれいかに


飛ばされてるんじゃなくて、test(i+1)で止まってると思えばいい
で、test(i+1)の処理が終わったら戻ってくる。

469 名前:440 [2007/12/31(月) 23:02:55 ]
test(i+1);で10になるまでループしてると考えれば良いんですか?
それで10になったら 987654321と戻ると?

470 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:03:02 ]
>>440
test は、9 から i までを出力する関数。

引数が 10 未満の時は、まず test(i + 1); とすることで 9 から i + 1 までを出力してから、その次に i を出力してるっしょ?
そういうわけで、9 から i までが出力される。
んで、10 以上の数を渡すと、if に引っかかって何も出力されない。

だまされた気分になっても気にしない。



471 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:07:15 ]
test(10)は何も表示しない。
test(9)はtest(9+1)を実行してから9を表示する。つまり、9を表示する。
test(8)はtest(8+1)を実行してから8を表示する。つまり、98を表示する。
test(7)はtest(7+1)を実行してから7を表示する。つまり、987を表示する。
…中略…
test(1)はtest(1+1)を実行してから1を表示する。つまり、987654321を表示する。
test(0)はtest(0+1)を実行してから0を表示する。つまり、9876543210を表示する。

472 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:13:23 ]
再帰関数を展開して1つ1つ理解しようとしても混乱するだけだよ。

例えば 9 から i までを出力する関数 hoge があるとするだろ?
それを使って test を実装しようとすると、一番簡単なのは hoge をそのまま呼ぶだけだけど、
それじゃ面白くないので 9 から i + 1 までを hoge に出力させて、
それから i だけを test 内で出力するという風にしてみよう。
そうすると

void test(int i) {
 if(i < 10) {
  hoge(i + 1);
  printf("%d", i);
 }
}

となるわけよ。これは分かるっしょ?

んで、この test っつー関数は 9 から i までを出力する関数になったわけだから、
hoge としてこの test が使えることになる。
というわけで、

void test(int i) {
 if(i < 10) {
  test(i + 1);
  printf("%d", i);
 }
}

としても同じ結果が得られるって寸法だ。

473 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:14:17 ]
>>459とほとんど一緒だけど
int main(void)
{
/* test(0)開始 */
if(0<2){
/* test(1)開始 */
if(1<2){
/* test(2)開始 */
if(2<2){
/* ここは実行されない */
}
/* test(2)終了*/
printf("%d",1);
}
/* test(1)終了*/
printf("%d",0);
}
/* test(0)終了*/
return 0;
}


474 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:18:46 ]
_beginthreadexでウィンドウハンドルを渡したいんですが、
どうすればいいですかね?

475 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:19:25 ]
スレ違い

476 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:19:57 ]
第3引数から渡すれ

477 名前:440 [2007/12/31(月) 23:21:05 ]
なんとか理解しました

>>460さんのが分かりやすかったです

まだ完全理解したという訳ではないので勉強してみます
回答してくれた皆様ありがとうございました。

478 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:23:03 ]
おそらくスタックがどんな感じなのかわかっていないかな?

iがスタック上に積まれる他に関数呼び出しによる復帰情報(ここだとtest()関数な)がスタック上に積まれるんよ
復帰情報は関数が何処に戻れば良いかを示すリターンアドレスが格納されている
ここではまだ実行されていないprintf()の直前

つまりイメージとしては
復帰←0←復帰←1←復帰←3←復帰…8→復帰←9←復帰
と積まれる(push)

でループから抜けると

今度は
復帰情報→0→復帰→1→復帰→3→復帰…8→復帰→9→復帰
と逆に飛び出してくる(pop)

つまりLIFO(Last In First Out)な訳
良くコインの入れ物として説明されている有名アレ

479 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:46:46 ]
ああなんか色々間違ってるなゴメン

正しくは
push時
main復帰←0←復帰←1←復帰←2←復帰…8←復帰←9←復帰

pop時
main復帰→0→復帰→1→復帰→2→復帰…8→復帰→9→復帰



480 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:55:51 ]
スタック云々言って理解できるなら、
再帰ぐらいで悩まないと思う…。



481 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 00:16:15 ]
うぬ、そうか、、、スタック説明しないと無理か 大変だな
えーっとスタックはローカル変数を格納する為のメモリ領域で・・・
ってスレ違いだなこりゃ

スマン調べてくれとしか言いようが無い
頑張ってくれ

482 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 00:18:39 ]
同じ関数だから混乱する。
引数が関数名だと思ってたどってみ
test(1)は test1(1)だと

483 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 00:23:13 ]
年越し勉強会になっててワロタ

484 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:18:13 ]
printf("あけおめ");

485 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:18:53 ]
puts("ことよろ");

486 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:35:47 ]
scanf("%d", &otoshidama);

487 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:39:34 ]
^D

488 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:42:40 ]
!#include <stadio.h>
int mein()
{
fprint("間違えを見つけた数×100000円お都市玉をもらえます");
}
return 0;

あけましておめでとうございます

489 名前: 【4円】 mailto:sage [2008/01/01(火) 01:49:08 ]
600000GET

490 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:52:21 ]
600000円が最高金額か
ダンヒルの最高値福袋2個分かよw



491 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 06:18:41 ]
Max \700,0000- ?

492 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 06:19:18 ]
\700,000-

493 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 13:25:28 ]
\nが無いのを間違いと見るなら800000円かな?


494 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 13:42:07 ]
>>474
4番目のvoid *arglistを使って渡すべし。

495 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:06:42 ]
函数の()の中にvoidとかを書かないのは間違い?

496 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:11:54 ]
函数の()って何だよ。
もうちょっと人に伝わる言葉で表現しろよ。

497 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:13:29 ]
さーせん。
「mein()」の()の事

498 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:14:36 ]
mein って何だよ

499 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:15:15 ]
こっちのセリフです><

500 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:17:14 ]
main



501 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:17:39 ]
>>497
それだけじゃ、宣言か定義か呼び出しかすら分からないわけだが・

502 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:19:24 ]
いえ、>>488のことですが・・・

503 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:21:26 ]
別に何の間違いでもないだろ

504 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:22:46 ]
( ) 内に何も書かなかった場合

○ プロトタイプ宣言
 引数がどうなっているか不明であることを表す。
 その後具体的な引数を指定した宣言や定義が現れない限り、
 この関数を呼び出す時、実引数は可変長引数の時と同じように扱われる。

○ 関数定義
 規格上は void であると見なされることになっている。
 ただし、上記に書いた通りの動作を起こすコンパイラもある。

○ 関数呼び出し
 そもそも ( ) 内に void と書いて呼んではならない。

505 名前:440 [2008/01/01(火) 16:48:42 ]
また質問っす
#include <stdio.h>
#include <string.h>
int ko(char *p);
int main(void)
{
char str[80];

gets(str);
printf("%d\n",ko(str));
return 0;
}
int ko(char *p)
{
int a;
a=0;
while(*p){
a++;
p++;
}
return a;
}
なんですが
while(*p)なんですが
str[80]に入力した文字をどのように繰り返してるんでしょうか?
while(*p)だと全然理解ができません
入力した文字列の\0(ヌル文字まで繰り返すんでしょうか?)


506 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 16:57:16 ]
while(*p != '\0') { } と同じ。

507 名前:440 [2008/01/01(火) 17:00:23 ]
ありがとうございます
*pとかよくわかりずらくて参考書にそんなようなこと書いてなくて
次はforでやってみようかと思います

508 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:00:32 ]
>>505
・C言語では偽が0、真が0以外
・whileは条件が真(つまり0以外)の間、ループを続ける
・C言語の文字列(char配列)はヌルターミネートといって最後にヌル文字('\0')が入っている
・ヌル文字の文字コードは0
・*は間接参照演算子

つまり
>入力した文字列の\0(ヌル文字)まで繰り返す
で正しい。
ヌル文字ではなかったらaをインクリメントし、ついでにpを進める、ということを繰り返す
まあ(半角)文字数を調べる関数だね

509 名前:440 [2008/01/01(火) 17:06:50 ]
>>508
あ!だからヌル文字で終わるんですね
ヌル文字=0って事を・・・

文字列とかが入るとややこしくなるんで
これを使えば特定の文字の数を数える関数とかへっちゃらっすね

510 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:25:47 ]
でも、ちゃんと '\0' と比較した方が読みやすいから比較しようぜ



511 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:35:04 ]
そうだね。
こんな読みにくいコード書いても、読みやすいコードに比べて実行速度が速くなる訳じゃないもんね。


512 名前:440 [2008/01/01(火) 17:42:21 ]
実行速度ってどうなんすか?
僕が作るプログラムではそこまでイライラするほどかからないんすが

513 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:54:41 ]
全く変わらん。

514 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:16:56 ]
#include <stdio.h>
int main(void)
{
  while(1)
  {
    printf("おまいら\n");
    printf("あけましておめでとう!\n");
  }
  return 0;
}

515 名前:440 [2008/01/01(火) 19:18:16 ]
ネットワークプログラム作りたいんすよね
どんな過程でネットワーク系に入りますか?
まずC言語の文法など覚えてたらすぐネットワーク系のプログラムとかやりますかね?

516 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:27:54 ]
ネットワークプログラムは結構めんどくさい。文法覚えただけでは苦戦する。
でも、目的を持って難題に立ち向かうのが上達の秘訣だとおもう。
コードを書いていれば、何が必要かだんだんとわかってくる。
すぐに作れなくてもあきらめないことが重要だよ。


517 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:47:55 ]
#if
#else if
#end if

の使い方がわかりません!
どういうときに使うんですか!

518 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:51:35 ]
以下の★1と★2のやり方で結果が同じになるのはどうしてなんでしょうか?
有識者の方ご教授をお願いします。

#include<stdio.h>

void * func(void *p){

printf("□■□func開始□■□\n");
printf("pのアドレス = %p\n",p);
printf("p = %d\n",(int)p);
(int)p += 100;
printf("p = %d\n",(int)p);
printf("□■□func開始□■□\n");

return NULL;

}
int main(void){

int number = 30;

printf("numberのアドレス = %p\n",&number);
func((void *)number);★1

return 0;

}


519 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:52:05 ]
#include<stdio.h>

void * func(int *p){

printf("□■□func開始□■□\n");
printf("pのアドレス = %p\n",p);
printf("p = %d\n",*p);
*p += 100;
printf("p = %d\n",*p);
printf("□■□func開始□■□\n");

return NULL;

}
int main(void){

int number = 30;

printf("numberのアドレス = %p\n",&number);
func(&number);★2

return 0;

}


520 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:58:22 ]
>>517
#define VER 2
#if VER < 2
//古いコード
#else
//新しいコード
#endif

みたいにソースを丸ごと切り替えるときに使ったりする
慣れると便利。



521 名前:440 [2008/01/01(火) 19:59:01 ]
>>514
それは、おまいら あけましておめでとうを無限ループですね?
while(1)なので

522 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:59:45 ]
>>518
1はちゃんと動くのか?

523 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:03:15 ]
>>522
*(int*)p += 100;
とすると、同じ結果が出るね。

524 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:05:54 ]
>>517
デバッグ時にコードを一時的に無効化したり有効化するのに便利だね。
/* */とは違って、入れ子にできるから楽

#if 0
hoge();
hoge2();
#endif


525 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:07:40 ]
>>523
ほんとに
func((void *)number);★1
こうなのか?

526 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:11:00 ]
>>525
たしかに。&がないと通らないね。

527 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:12:32 ]
>>523
怒られるんだけどw

528 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:25:21 ]
>>520 >>524
ありがとうございます!
ということは int VER みたいなフラグを作っておいて使うんですね!

#if 0
とか参考にしてたソースに出てきてわからなかったです
ありがとうございました!

529 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:42:21 ]
>>528
>int VER みたいなフラグ
駄目です、それじゃ使えません

530 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:46:59 ]
>>523
*(int*)p
それは参照先がアレじゃないか?



531 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:52:07 ]
>>518
そのこぴぺされたコードで、コンパイルして実行できるか、もう一度確認してみてくれないか?
ちなみにWindows?もしかしてDOS?


532 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:53:06 ]
>>529
orz
使い方おしえてくだしあ

533 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:55:26 ]
>>532
>>520

ただの置換だと思えばいい

534 名前:440 [2008/01/01(火) 21:01:52 ]
viみたいなエディタ作るには
1人じゃ無理すかね?

535 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:03:12 ]
>>532
プリプロセッサと呼ばれる機能なのだ。
#defineはマクロで、文字列の置き換え
#define VAR 2
と書くと、今後ソースのVARは2という文字に置き換えられる。

#ifは条件付コンパイル。式が0でなければ有効となる。
#if VAR>1
と書くと、以下と同意になる。
#if 2>1
となって、式の結果は、1なので、有効となる。

536 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:03:21 ]
viみたいなエディタなら無理じゃない

537 名前:440 [2008/01/01(火) 21:05:24 ]
画面上に色とかつけたりしてるのは、あれはC言語でやってるんすかね?
viで色とかが使えるすがスキームなど色文字を表示することは可?

538 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:06:45 ]
>>537
DOSなら、エスケープシーケンスじゃないか?


539 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:14:13 ]
WindowsならコンソールAPI

540 名前:440 [2008/01/01(火) 21:15:29 ]
Linuxじゃ無理すか?
たしかにwindowsだと猫でもわかるC言語に書いてありましたが



541 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:18:55 ]
猫か…

542 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:21:45 ]
>>540
linux
エスケープシーケンス使えるよ
printf("\033[31mhogehoge\n");
って感じで

543 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:25:50 ]
VT100か

544 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:25:59 ]
>440
ちょっとは自分の頭を使って集中して物を考えたり調べも伸したりする習慣をつけろよ

545 名前:440 [2008/01/01(火) 21:47:36 ]
>>542
すげーっすね!
できましたよ
エスケープシーケンスで調べてきます

>>544
以後気をつけます

546 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 00:02:28 ]
>>523

左辺値にキャストはできないだろ?


547 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 09:04:56 ]
>>546
これを実行してみてほしい

#include<stdio.h>

int main(void){
long num=1234;

*((char*)&num)+=65536+256;
printf("%ld\n", num);
*((short*)&num)+=65536+256;
printf("%ld\n", num);

return 0;
}

548 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 09:59:34 ]
キャストしたものは左辺値じゃないけど、* をつけたから左辺値で通るんだよ。

549 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 22:28:47 ]
#include <stdio.h>
#include <malloc.h>
main(togo,toog)
int togo;
char *toog[];
{char *ogto, tgoo[80];FILE *ogot; int oogt=0, ootg, otog=79,
ottg=1;if ( togo== ottg) goto gogo; goto goog; ggot:
if ( fgets( tgoo, otog, ogot)) goto gtgo; goto gott;
gtot: exit(); ogtg: ++oogt; goto ogoo; togg: if ( ootg > 0)
goto oggt; goto ggot; ogog: if ( !ogot) goto gogo;
goto ggto; gtto: printf( "%d goto \'s\n", oogt); goto
gtot; oggt: if ( !memcmp( ogto, "goto", 4)) goto otgg;
goto gooo; gogo: exit( ottg); tggo: ootg= strlen(tgoo);
goto tgog; oogo: --ootg; goto togg; gooo: ++ogto; goto
oogo; gott: fclose( ogot); goto gtto; otgg: ogto= ogto +3;
goto ogtg; tgog: ootg-=4;goto togg; gtgo: ogto= tgoo;
goto tggo; ogoo: ootg-=3;goto gooo; goog: ogot= fopen(
toog[ ottg], "r"); goto ogog; ggto: ogto= tgoo; goto
ggot;}
これは何ですか?

550 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 23:13:44 ]
たしかIOCCCのプログラム。別に何ってわけじゃない。



551 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:00:33 ]
頭が物故割れた

552 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:24:50 ]
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
 char *position, line[80];
 FILE *fp;
 int counter=0, num, maxbuf=79;
 if ( argc == 1) {return 1;}
 fp= fopen(argv[ 1], "r");
 if ( !fp) {return 1;}
 position= line;
 while ( fgets( line, maxbuf, fp)) {
  position= line;
  num= strlen(line);
  num-=4;
  while (( num > 0) && ( !memcmp( position, "goto", 4))) {
   position= position +3;
   ++counter;
   num-=3;
   ++position;
   --num;
  }
 }
 fclose( fp);
 printf( "%d goto \'s\n", counter);
 return 0;
}

たぶんこういうこと

553 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:40:09 ]
まちがえた、・・・まぁいいか・・・

554 名前:デフォルトの名無しさん [2008/01/05(土) 01:12:12 ]
Javaを半年ほどやってCを最近始めた素人です。

同じソースファイル内でも関数の定義位置が違うだけで、
コンパイラが、関数宣言ないよー。という警告をするのが、
いまいち慣れないのですが。

static宣言な、ファイル内スコープの関数なんかでも、
プロトタイプ宣言ってきちんとしたほうが良いのでしょうか。

手元にあるC言語入門だと、main関数を最後のほうに、
定型的な計算用の関数等を、頭のほうにもってきて、
プロトタイプ宣言を書かないようしているのですが、
皆様はどういった書き方をしておられるのでしょうか・・・。

555 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 01:14:41 ]
>>554
基本的に、ソースファイルの書き方は一貫性が大事だと思っている。
だから、一貫性を持って読みやすければそれでOKだ。

556 名前:デフォルトの名無しさん [2008/01/05(土) 01:29:27 ]
>>554
おぃ… どのportでaccessしろと云うのだ?

557 名前:デフォルトの名無しさん [2008/01/05(土) 01:51:07 ]
www.microsoft.com/japan/msdn/vs/vcsharp/mth_lexicograp.aspx
から.msiインスコしたまではいいですが、ここからどうすればアプリとして起動できますか?
よく分からないままMS Visual C#2008入れました。
最終的にやりたいのは、nCrで任意のnとrを最初に指定して、.txtファイルで1行毎に記述した多数の序数x(1≦x≦nCr)を組み合わせ化して別の.txtファイルにsaveすることです。

558 名前:デフォルトの名無しさん [2008/01/05(土) 02:09:33 ]
方向音痴な初心者です
因みに… '/usr/share/doc/man1/或.zg
個人の計算では恐らく'/usr/share/doc*
全てを読み込む様に為っていた筈…

559 名前:デフォルトの名無しさん [2008/01/05(土) 02:20:37 ]
最後の状態…
1・再起動がBIOSに到達せず再起動…
2・停止がBIOSに到達せず停止の筈が再起動…
3・RANを切らないと停止せず…

560 名前:デフォルトの名無しさん [2008/01/05(土) 02:25:06 ]
斯様に考えてもfile内に.pngを埋め込むのは無理と考えerror_fileを削除の末…
此の顛末…



561 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 02:31:08 ]
次の質問をどうぞ

562 名前:557 [2008/01/05(土) 02:42:49 ]
see me(>>557) plz!

563 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 02:55:06 ]
>>557>>562
ここはC#のスレではありませんよ

564 名前:557 [2008/01/05(土) 03:49:11 ]
>>563
Spcially sorry, sir.

565 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 07:32:27 ]
>>554
> 手元にあるC言語入門だと、main関数を最後のほうに、
> 定型的な計算用の関数等を、頭のほうにもってきて、
> プロトタイプ宣言を書かないようしているのですが、
> 皆様はどういった書き方をしておられるのでしょうか・・・。

基本的に読むときのことを考えて書く。
文章は上から下へ向かって読む。
だからプロトタイプ宣言も書いてmainの下に呼び出す関数を書く。

よく見るif (0 == a) みたいなやり方(=を書き間違えるミスを防ぐやつね)
もバッドノウハウだと思う。

566 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 09:07:16 ]
>>565
最後の2行は同意するが、関数をボトムアップで書くのは臨機応変でありだと思う。

567 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:07:08 ]
>>565

> よく見るif (0 == a) みたいなやり方(=を書き間違えるミスを防ぐやつね)
> もバッドノウハウだと思う。

なんで?
他にいい方法ある?

568 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:07:35 ]
はい、次の質問どうぞ〜

569 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:14:55 ]
>>565
>基本的に読むときのことを考えて書く。
>文章は上から下へ向かって読む。
>だからプロトタイプ宣言も書いてmainの下に呼び出す関数を書く。
うーん・・・微妙。
結局main関数がファイルの一番上に来るわけでもないし、
mainを最初に持ってきたからって可読性は上がらないと思う。
コード全体で一貫性があればケースバイケースどころか
趣味の範疇じゃない?

570 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:18:41 ]
>>567

最近のコンパイラなら警告を出すはずだし、lintもある。
それに、
 if (a = b)
は防げない。

-Wall で出る警告をすべて潰すか、lintを使う習慣をつけたほうが良い。




571 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:19:25 ]
Cに慣れると関数がボトムアップに並んでないと不自然に見えてくる。

572 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:32:24 ]
>>555で終わってるネタ

573 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:32:49 ]
>>569

おれは >>565に同意。
main関数を一番下に持ってくるのは、プロトタイプ宣言がなかった頃の
古い習慣を引きずってるだけだったはず。

>結局main関数がファイルの一番上に来るわけでもないし、

これはその通りだけど、プロトタイプ宣言を長々と書くことは少ないし、
たとえ長くなっても関数ブロックがどこから始まるかはすぐわかるので、
main関数が上にあるはうが見つけやすい。

あと、呼び出す関数の引数などを見たいとき、
プロトタイプ宣言が一箇所にまとまっているほうが見やすいと思う。

まあ、これはコーディングスタイルだから、強くは主張しないけど。


574 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 11:27:15 ]
>>573
プロトタイプ宣言のなかった頃という実例を提示してくれ。
宣言がなかったら外部の関数は一切まともに呼べないと思うのだが。

575 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 11:28:40 ]
> mainがどうとか
最近はフリーのでもエディタが強いからなぁ。
気にならなくなったし気にしなくなった。

576 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 13:31:36 ]
10個の配列に入っている数それぞれが
全て異なるってどういう風に書けばいいんでしょうか?

577 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 13:37:21 ]
int array[10];
for (int ic = 0; ic < sizeof(array) / sizeof(* array); ++ic) array[ic] = ic;

578 名前:576 mailto:sage [2008/01/05(土) 13:45:39 ]
追記すいません。
10個の配列には既に数字が入っていて
条件式でかくならどうすればいいですかね?

579 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 13:58:18 ]
ループでまわすか45個条件式書くか、好きなほうにしろよw

580 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:23:57 ]
無駄に再帰

int unique(int array, int n){
 int i;
 if(n <= 1)return 1;
 for(i=1; i<n; ++i)
  if(array[0] == array[i])
   return 0;
 return unique(array+1, n-1);
}



581 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:29:42 ]
要素数intを再帰するのはちょっと勇気がいる。「スタックはもう0よ」に気をつけて。

582 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:34:42 ]
要素10個の配列を想定した再帰でスタックの心配とかw

583 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:35:36 ]
>>581
そこで最近覚えた末尾再帰の最適化ですよ。

584 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 15:10:46 ]
"入っている数"があまり大きくない数字(例えば0〜9999とか)なら、
配列(例なら10000要素)を用意して重複チェックするという手もある
10回ループすればわかる

585 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 15:56:01 ]
ソート済み配列なら楽なんだがな

586 名前:576 mailto:sage [2008/01/05(土) 16:39:31 ]
>>584ので
わかった気がします。
ありがとうございました

587 名前:584 mailto:sage [2008/01/05(土) 17:50:36 ]
あぁ 577 にもヒントが
見落としていたよorz


588 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 17:59:25 ]
mainなんて最後に読むから下にあったほうが邪魔にならなくていいな

589 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 00:48:37 ]
mainから読まないと理解できない俺はorz

コメント豊富ならいいが、
そうでなければ順を追わないと分かりづらい……

590 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 00:56:00 ]
どうせ上から下に綺麗に順に追って読めるわけじゃないから、どこにmainがあってもいいや



591 名前:554 mailto:sage [2008/01/06(日) 01:04:01 ]
レス有難う御座いました。
結論としては>>555なのでしょうが。

自分はIDE使っていて、
>>573さんの様なスタイルがやりやすそうです。

コンソールでUnixプログラムとかを書ける様な方だと
また意見も変わってくるんでしょうかね…。

>>571とかも参考になります。
皆様ご意見有難う御座いました。

592 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 04:10:09 ]
すいません、超初心者なんですが判らなくなったので教えていただけませんか?
今アクセスカウンタを作ろうと思って、まずは簡単に動く物をテストで作ってみ
ようかと思ってるのですが、思った動作をしてくれません・・

ipアドレスをゲットして、そのipアドレスから連続でアクセスがあった場合カウンタ
が回らないようにしたいです。超初心者の自分なりに書いてみたのですが、同じipから
のアクセスでもカウンタが回ってしまいます。ソースは

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
main()
{
long i;
FILE * fp;
char *test,*ip,*count="count.dat",*addr="addr.dat";

test = getenv("REMOTE_ADDR");
fp = fopen(addr,"r+");
fgets(ip,30,fp);

if(ip==test){
printf("test");
fclose(fp);
}



593 名前:592 mailto:sage [2008/01/06(日) 04:11:42 ]
else
{
fprintf(fp,test);
fclose(fp);

fp=fopen(count,"r+");
rewind(fp);
fscanf(fp,"%6ld",&i);
i++;
rewind(fp);
printf("Content-type: text/plain\n\n\0");

fprintf(fp,"%06ld",i);
printf("%06ld",i);

fclose(fp);
}
}


こんな感じです。多分どっか物凄く適当な事をしてる部分があると思うのですが
自分ではぜんぜんそれがどこか判りません・・・

誰か教えてください・・・

594 名前:592 mailto:sage [2008/01/06(日) 04:13:28 ]
あー15行目の
printf("test");
はif文に入ったかどうかチェックする為に書いた物で意味はありません。

595 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 04:19:46 ]
基礎からやった方が良いと思うけど、とりあえず。

・ipは只の未初期化のポインタ
・文字列の比較は==ではしない

596 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 04:19:57 ]
 >>592
char* ip; で
fgets(ip,30,fp); は臭う

if(ip==test) ポインタ比較してどうする
文字列比較は strcmp (string.h)
全部読んでないが、ここら辺。

597 名前:592 mailto:sage [2008/01/06(日) 04:35:19 ]
>>595-596
こんな時間なのに即レスありがとうございます。
もう少しポインタの勉強してきます・・・

598 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 04:42:36 ]
ポインタの前に配列を

599 名前:592 mailto:sage [2008/01/06(日) 04:56:42 ]
あぅあぅ・・
眠いせいか全く頭まわらず、未だ解決の糸口が掴めません・・今日はもう寝ます。

もしよかったら592の鳥頭でも判るcの初心者向け解説サイトなんかあったら教えていただけますか?orz
よく寝て頭冴えてる時にもう1度チャレンジします。

600 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 05:09:17 ]
>>599
ttp://www9.plala.or.jp/sgwr-t/



601 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 05:09:35 ]
>>592
char *test,ip[128],*count="count.dat",*addr="addr.dat"; にして

if(ip==test){ は
#include <string.h> を追加して if(strcmp(ip, test) == 0)だな

あと、printf("Content-type: text/plain\n\n\0"); の最後の\0は要らない

サイトより、しっかりした一冊を読んだほうが為になると思う

602 名前:592 mailto:sage [2008/01/06(日) 05:55:21 ]
眠い目こすりながら"もうちょい・・もうちょい・・"ってやってたら出来ました!
600さん601さんありがとうです。ほぼ601さんの書き込み通りで出来ました。

else
の後に
rewind(fp);
が無かったのでaddr.datが追加書き込みで上手く働かなかったのだけ
なんとか自力で見つけて修正しました。ホント有難うです!

603 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 10:25:50 ]
>>574

つ homepage3.nifty.com/ryuz/c/about_ansi.html


>宣言がなかったら外部の関数は一切まともに呼べないと思うのだが。

外部の関数はextern宣言で呼ぶ。
古いソースを見ると、こんなのを見かける。
#ifdef __STDC__
int func(int arg1, char *arg2);
#else
int func()   /* これが古いスタイル */
#endif

今はもう過去の遺物だが。


604 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 10:36:54 ]
まだやんの

605 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 12:26:34 ]
>>603
まさか、その「古いスタイル」という奴は宣言ではないとでも?

606 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 12:42:43 ]
昔はいきなり呼べたような。
そのためmath.hをインクルードしてないと引数がintになったりしてたような

607 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 12:45:03 ]
今でもいきなり呼べるよ

608 名前:603 mailto:sage [2008/01/06(日) 12:59:23 ]
>>605

ごめん、間違えた。
#ifdef __STDC__
extern int func(int arg1, char *arg2);
#else
extern int func()   /* これが古いスタイル */
#endif

こうだった。


609 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 14:23:04 ]
>>608
セミコロン要らないの?

610 名前:603 mailto:sage [2008/01/06(日) 15:20:15 ]
>>609

もちろん要るorz




611 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 16:17:55 ]
まだやってたのか。

>>605
とりあえず「プロトタイプ宣言」では無いと思う。

>>606-607
>引数がintになったりしてたような
戻り値とちゃうか?
んで、暗黙の戻り値の型はC99でダメにならなかったっけ?

612 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 17:17:39 ]
>>611
古い仕様やANSI非準拠の環境ならプロトタイプ宣言なくても関数呼び出しが可能。
戻り値は省略された場合intとみなす(これは確か規格)
引数はそこに関数呼び出しがあるならプロトタイプ宣言がなくとも予測できる。

int func();// ←プロトタイプ宣言
int a = func( 5, "hoge" );
と書かれていればfuncの引数が予測できる。


613 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 17:22:03 ]
予測も何も、そのままスタックに積んで取り出すだけでしょ
あってる限り問題は出ない

614 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 17:32:58 ]
コール規則が複数あるような場合に嵌るだろ

615 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 17:47:37 ]
プロトタイプを人間が確認してるようなもんだな

616 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 19:08:31 ]
>>612
なんか色々とウサンクサイな・・・

617 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 20:50:50 ]
まぁ、math.hをインクルードせずにprintf("%g\n", log(1))してみたまえ。いいもんだ。

618 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 21:04:47 ]
%gってなんすか?教えてくだしあ

619 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 21:07:50 ]
printfでぐぐれ

620 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 21:08:20 ]
manコマンドしか見てなかったよ



621 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 21:09:06 ]
ごめんうそ

622 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 21:21:22 ]
普通に、man printfしても出てくるでしょうが。

623 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 22:21:17 ]
プロトタイプ宣言。
200〜300行程度のプログラムならなんとでもなるね。
問題は複数の Cファイルに分割しなければいけない時。
ファイル数が多くなり、extern 関数呼び出しが多くなった時
プロトタイプ宣言が有る場合と無い場合とではバグ出現回数が
大幅に違ってくる。
プロトタイプ宣言する事を癖にした方が良いよ。

624 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 22:22:41 ]
ますます話が迷走を深めてまいりました

625 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 22:26:46 ]
>ファイル数が多くなり、extern 関数呼び出しが多くなった時
>プロトタイプ宣言が有る場合と無い場合とではバグ出現回数が
>大幅に違ってくる。
ソースキボン

626 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 22:42:32 ]
>>625
プロトタイプ宣言がない場合、関数の引数の数と型を合わせるのはプログラマの責任になる。コンパイラはチェックしない。
ファイル間の膨大な数の関数と呼び出しで、それを完璧にやれる人はまずいない。

627 名前:623 mailto:sage [2008/01/07(月) 00:38:00 ]
>>625
ソースなんてないよ。 実体験。
まだ経験してないのであれば...幸せなのか天才なのか、はたまた...

628 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 00:42:39 ]
ソースが無いのにどうやって体験したんだとか勘違いした俺はどうすれば

629 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 01:02:06 ]
>>628
俺も一瞬思ったw

>>627
昔はソース書いてからコンパイラに吐かせてプロトタイプ作ったりもしたが
今はIDEもあるし、ほぼ同時に作るべ、
複数人でやるならソースとヘッダの提供は不可欠だしな

630 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 01:04:46 ]
627と628の言うソースは違うものを指していると思われ。




631 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 01:06:02 ]
野暮だな

632 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 03:51:40 ]
そんなことは628もわかってんのにな

633 名前:U [2008/01/07(月) 17:58:56 ]
質問です・・
if (a < (int)(a * 10) % 10){
a = (int)a+1;
}
(注:aはdouble型です)
上記のような文がプログラム中にあったとき、aを7.1なら8のように小数の切り上げをしたいんですがこれでなっていることになるのでしょうか?
小数の切り上げの方法を知っていたら教えてほしいです(標準関数を用いない方法で)。

634 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 18:08:15 ]
その前に標準関数を使って行けない理由を聞かせてもらおうか。

635 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 18:15:09 ]
条件がはっきりしないけど、0.9足して切捨てとか

636 名前:633 [2008/01/07(月) 18:22:42 ]
>>634
学校の課題なので使ってはいけないという制限があるんです。
>>635
回答ありがとうございます。
ですがすみません7.1の他にも小数があるのでそれ以外にも対応出来るようにしたいんです。

637 名前:633 [2008/01/07(月) 19:05:00 ]
if文の不等号を逆にしたら出力したい結果が無事でました!!
とても答えづらい質問ですみませんでした。

638 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:10:03 ]
は?

639 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:11:03 ]
解決したと思ってるんならそれでいいだろ。
詮索することはあるまい。

640 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:32:25 ]
「宿題の回答」としてはベストな回答だと思うよ。



641 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:35:31 ]
アホだろ

642 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:44:31 ]
(n + d) / d;
だめ?

643 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:47:15 ]
だめ

644 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:52:15 ]
適当に貼ってみる
#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[]){
double value=100.001;
long result;

if(argc>=2) value=atof(argv[1]);

result=value; /* この行と */
if(value>result) result++; /* この行 */

printf("%ld\n", result);

return 0;
}

645 名前:デフォルトの名無しさん [2008/01/08(火) 00:57:40 ]
101 287 345 391 348 287 391
371 388 39 388
88 404 150 428 404 387 145 299 404 197
320 397 141 342 428 429 206
36 214 412 88 176 214 346 210 406 308
250 26 112 370 328 328 284

こんな感じのデータファイル(data.txtの一部です)を2次元配列にいれるにはどうプログラミングすればいいですか?
改行とかスペースをどう考慮していけばいいかさっぱりです

646 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 01:07:31 ]
>>645
つ[fscanf()]

647 名前:デフォルトの名無しさん [2008/01/08(火) 01:10:12 ]
>>645
fscanfでも使ったら?

648 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 01:13:50 ]
>>645
for(i = 0; !feof(fp); i++){
do{
fscanf(fp,"%d",&date[i][j++]);
}while(fgetc(fp) != '\n');
}

649 名前:デフォルトの名無しさん [2008/01/08(火) 01:28:52 ]
いやfscanfも普通に改行コード読み飛ばすし

650 名前:デフォルトの名無しさん [2008/01/08(火) 02:15:50 ]
>>648
!feof(fp); って何ですか?



651 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 02:24:07 ]
 >>650
 つ www9.plala.or.jp/sgwr-t/lib/feof.html
ファイルの終端でない間ループする
0 != feof(fp)

652 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 03:13:53 ]
今年からやさしいCを買ってはじめたんだけどscanfがでてきてからいっきに面白くなってきやがったぜ!

653 名前:デフォルトの名無しさん [2008/01/08(火) 03:36:40 ]
ほとんど利用しない命令

654 名前:デフォルトの名無しさん [2008/01/08(火) 03:46:36 ]
>>652
面白くなってきたのか!!
良いことだ!!
ただ油断するなよ。
scanfの仕様をもう一度確かめるんだ!!
不具合が多くて嫌になるぜ!!

655 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 05:02:29 ]
>>653
ほとんど使わないのかよ!

>>653
printfとかだとなんか字がでてくるだけでつまらなかったけど
scanfだとキーボード側から入力できて面白くなってきたぜ
しかし練習問題やったら、doubleなのに変換仕様を%fにしてたり
変数の前に&入れてなかったりとミス多発\(^o^)/

質問スレなのにすいません

656 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 05:50:55 ]
>>655
scanfは正しい入力をしているならまだいいが、ひとたび間違った入力が来ると簡単にバグの原因になる。
整数(%d)を欲しいところで文字列なんて打っちゃった日にはもう・・・
まぁ外に出すようなものじゃなければ気にしなくてもいいけどね。
慣れてきたらそこらへんも勉強してみるといいと思うよ。

657 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 08:03:25 ]
>>651
0 == feof(fp)

658 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 10:07:45 ]
!feof(fp)
だろ。それじゃ4バイトも無駄になる。

659 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 10:15:14 ]
とりあえず、入力と出力ができるようになってからいろいろ試せるんだし
scanfから入るのもいいんじゃない?そのうち使わなくなるだけで

660 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 13:18:16 ]
>>658
どこでどんな4バイトが無駄になるんですか?



661 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 13:40:14 ]
>>656
それは返り値でなんとかなるだろ
いやscanfで値取得がだめなのはもちろんなんだがな、オーバーフローは検知不可能できないし

そもそも>>658は誰宛なんだよwww

662 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 13:48:35 ]
>>661
>オーバーフローは検知不可能できないし
検知できるんですか? できないんですか?
そもそも、その「オーバーフロー」とはなんのことですか?

663 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 13:49:56 ]
知らない言葉が出てきたら自分で調べる癖つけないといつまでたっても上達せんよ

664 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 14:04:00 ]
>>662
オーバーフローとは
風呂にお湯を張るとき、止めるのを忘れたときに起こる奴

665 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 14:07:58 ]
エウレカ!エウレカ!

666 名前:662 mailto:sage [2008/01/08(火) 14:57:16 ]
>>663
「オーバーフロー」の意味は判るのですが、整数値の入力でどんなオーバーフローが起きるのかと思いまして。

667 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 15:07:06 ]
intの最大値は(4バイトの場合)2147483647でこれ以上大きい数値は格納できない。
longもunsignd intもcharもそれぞれに最大・最小値があるから、それを超える値を入力されると困る。

668 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 15:38:01 ]
char *foo[] = {"C/C++", "は", "市ね"};
のような文字列の配列があった場合に、この配列の長さ(上の例では3)を
取得するにはどのようにすればできるでしょうか?

length のような関数があるのではないかと思うのですが、、、

669 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 15:39:06 ]
sizeof(foo)/sizeof(*foo)

670 名前:662 mailto:sage [2008/01/08(火) 15:49:00 ]
>>667
なるほど。で、それは検知不可能なんですね?
では検知できる入力関数はあるのでしょうか。
或いは、桁数制限してしまえばオーバフローは回避できますよね。



671 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 15:55:39 ]
getsとかで数字を文字列として読み込んで、atoiとかで文字列を数字に変換する、とか。
文字列としてならいくらでも大きい数値を入れられるし、atoiはオーバーフローを検知してくれる。

672 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:12:32 ]
>>669 ちょっとダサイけど、thx!

673 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:16:36 ]
>>671
getsはない。

674 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:19:02 ]
んだ。今度はバッファオーバーフローだな。

675 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:20:31 ]
scanfでも桁数制限できるだろ

676 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:24:41 ]
>>650
if(!num) はif(num == 0)と
if(num) はif(num != 0)と同じ意味

while(!feof(fp))はfeofの返り値が0になるまでって意味

677 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:32:53 ]
ごめん
feofの返り値が0の間

678 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:38:00 ]
>>671
果てしなく無意味なオーバーフロー対策だなwwwwwwwww

679 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:39:34 ]
プロンプトで入力待ちするプログラムなんて練習のときくらいしか使わんからなんでもいいべ
リダイレクト前提のやつはこの限りでもないが。

680 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:56:16 ]
for(i=0; i < 10; i++){
printf("%d %d\n",x++,x);
}
だと表示される値は2つとも一緒なのに
printf("%d %d\n",x,x++);
に変えるとなぜ左側のほうが大きくなるのでしょうか?
後ろに++を付けているのだから右側が大きくなるべきだと思うのですが



681 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:57:05 ]
なんだべきって

682 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:58:08 ]
>>680
それ未定義動作
まあ理由としては、引数は後ろからスタックに積むから後ろの式を先に評価するケースが多いからだろうな。

683 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 17:03:12 ]
>>681
「べき」って使いませんか?
「大きくならなければならないと思うのですが」というニュアンスです。

>>682
素早い回答有り難うございます。

684 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 17:10:17 ]
681は日本語を勉強するべきだろう。

685 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 17:49:24 ]
SEになりたくて、IT企業に就職しても、
途中で挫折する人がいて退職する人も多々いると聞きます。
そう言われてる箇所は、だいたいどういう箇所なのか
具体的に教えてくれませんか?

686 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 17:50:06 ]
人間関係

687 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 18:03:14 ]
マ板で聞け
pc11.2ch.net/prog/

688 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 20:04:43 ]
UNIX Cシェルのmakefileで、
外部の環境変数が設定してあるファイルを
makefileの中から読み込むことって出来ますか?
出来るなら方法を教えてください。

689 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 20:17:37 ]
さすがにそれはシェルスクリプトのスレかmakeのスレで聞いた方がよくね

690 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 20:29:21 ]
>>689
ありがとうです
makeスレがないですね
シェルはあまり関係なさそうだし・・
うーん。どこがいいんだろ・・



691 名前:688 mailto:sage [2008/01/08(火) 20:38:44 ]
それっぽいスレ見つけました
そちらで聞いてみます。どうもありがとうでした。

692 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 21:03:00 ]
fopenの書き込みモードで第1引数(?)にC:\save.txtのように入れたのですが、指定したフォルダを探してもファイルがありませんでした。
エラーは出なかったのでおかしいと思って、読み込みモードで同じフォルダを指定すると読み込むことができました。
あれ?と思いそのフォルダを開いてみたのですが、ファイルは見当たりませんでした。
これはどういうことなんでしょうか?

693 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 21:04:03 ]
>>692
C:\\save.txt

694 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 21:05:43 ]
え?ファイルが無いのに読み込めたの?

695 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 21:08:09 ]
>>693
ありがとうございます!
ファイルを保存できました。

>>694
そうなんです
これはなぜだったんでしょうか?

696 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 21:35:54 ]
>>695
書き込みモードで起動したときにファイルを作成したと思う。

697 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 21:51:47 ]
>>692
別のフォルダでsave.txtというファイルをまず作ってくれ
それをお前さんが指定したフォルダにコピーできるか試してみてくれ
あと使っているOS教えてくれ
見えないというのはGUIを使っているということでいいのか?

698 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 22:13:51 ]
>>697
コピーできました。
OSはWindowsXPです。
GUIです。

D:\save.txtで書き込むとちゃんとファイルが出来ました。
指定したフォルダはCの中にあり、その奥に既にsave.txtがあったのが問題だったのでしょうか?
勝手に探してくれたということだと思うのですが。

699 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 22:25:38 BE:314515679-2BP(294)]
上のほうでfeof()で終了判定してるやつがいるけど、どこの素人だよ。
fscanf()がEOFを返したときに終了するのが普通。

700 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 23:08:51 ]
>>698
何も解決にならないでこんなこというのもなんだが
画面に絵とかファイル名とかが表示されてないだけで実際はファイルが生成される現象かな
Windows使ってる友人から以前聞いたことある
ブラウザからテキストの内容を見ることできると言っていたかな
力になれなくてすまん



701 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 23:16:15 ]
>>699
なら>>645のためにも
>>648よりスマートに書いてみろよw

702 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 23:36:51 BE:29954423-2BP(294)]
feof()の仕様って欠陥だろ。
なんでこんな使いどころのない関数があるんだよって感じ。

703 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 23:39:32 ]
エラー時に、ファイル終端に到達したのか
エラーが発生したのかチェックするために使うんじゃね。

704 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 00:05:44 ]
バイナリファイルはfeofで、特に他では使うなとか聞いたな

705 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 00:07:24 ]
>>704
それを言ってた奴は馬鹿。

706 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 00:10:05 ]
読み込みエラーが発生して、ずっとエラーから復帰できなかったら、
永遠にファイル終端に達しないから、エラーチェックしないと feof は危険。
しかし、そのエラーチェックでファイル終端も分かるから・・・。

707 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 10:00:41 ]
feofが単独で存在するのは読まずにチェックすることがあるからで、
読んでるのなら使うことはないな。

708 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 16:03:33 ]
まあ、読まないとEOFフラグセットされないわけだが

709 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 22:44:54 ]
0バイトのファイルを開いた直後の状態でもEOFではないでしょうか?

710 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 22:46:43 ]
ではない



711 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 00:44:18 ]
別に読むのがライブラリで自分が読まないケースだってあるんだよ

712 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 02:27:56 ]
>645 は1行あたりのデータ数がまちまちなんだが、そもそも
>2次元配列にいれる
っていうルールはどんなんだ?

713 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 02:41:23 ]
連投嫌われる?
聞きたい事いいいいっぱいあるです・・・。

714 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 02:49:36 ]
重要度の高い順に少しずつ質問すればいいと思うよ。

715 名前:713 mailto:sage [2008/01/10(木) 02:57:50 ]
じゃぁひとつだけ><

ソケット通信用のIOを得たときや、
open などのシステムコールを使って
ファイルディスクリプタを得た時など、
これらのリソースが正数型で返されますが、
この返り値は単なる確保したIOリソース用の
管理用番号みたいなモノと考えて良いのでしょうか?
また、もしそうならば、同一の正数値を指定さえすれば、
同じリソースに対して操作が可能なのでしょうか?

716 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 03:02:50 ]
>>715
open()の度に更新されるから、無理。勿論、close()しない限りは変わらないが。
# 例外は、stdin, stdout, stderr, stdaux相当のディスクリプタ。

717 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 03:17:54 ]
>>716さん
レスありがとうございます!

>open()の度に更新されるから、無理。
これに関してはもちろんわかっています。
ただ、返り値自体がどの範囲でどういった形で、
有効なのかが解らなかったもので…。
(IOを得るのにポインタとかで操作しないのかなー?と思ったのです。)

同じプロセス上から同じ値で参照した場合。
という意味で書きました。解りにくくてすみません…。

でも
>勿論、close()しない限りは変わらないが。
ということは715は合ってると考えていいですよね?

># 例外は、stdin, stdout, stderr, stdaux相当のディスクリプタ。
参考になります!

718 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 03:19:37 ]
訂正です。

誤:ということは715は合ってると考えていいですよね?
正:ということはclose()しない限りは715は合ってると考えていいですよね?

結果的に連投になってしまいましたすみません><

719 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 03:30:02 ]
>>718
同じプロセス上でopenしたままの記述子なら同じ。
というかそうじゃないと全てのIOが出来ない。

720 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 04:17:52 ]
char array[256];
と宣言したら
sizeof(array);
で256が返ると思います。でも、

void print_arraysize(char *array) {
  printf("%d",sizeof(array));
}

というようにするとポインタのサイズが返ります。
呼び出される関数側から配列のサイズを知る方法はありますか?



721 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 04:22:46 ]
>>720
Cでは無理です。諦めて、その関数にサイズも渡すしかありません。

722 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 12:21:11 ]
>>720
構造体の中に配列入れて構造体を引数にすれば、関数に配列を渡せる。
ただ、関数を呼ぶときに構造体の中身の全コピーが作られるので、激しく無駄。

配列の要素数を1つ多めに作っておいて、そこに目印となる値を入れておいて、
関数側で数えるという手もある。

けど結局はfunction( array , sizeof(array) )のようにして呼び出す
関数を作るのが一番かと。

723 名前:デフォルトの名無しさん [2008/01/10(木) 13:52:06 ]
自然数n = 10, r = 0, 1, . . . , 10 に対してnCr を出力するプログラムを教えてください。もしくはそれが載ってるサイトを教えてくださいm(__)m

724 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 13:55:15 ]
>>723
C/C++の宿題を片付けます 102代目
pc11.2ch.net/test/read.cgi/tech/1199515728/

725 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 20:23:44 ]
くだらない質問なのですが
Cで

static int hoge;
int static hoge;

の違いって、前者が大域変数になって
後者が関数内で静的な、値を保持しつづける関数になるってことですか?

726 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 20:26:52 ]
違う。
staticのような修飾子と型名は順不同というだけ。

727 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 20:28:17 ]
>static int hoge;
>int static hoge;

その2つは一緒

>前者が大域変数になって
>後者が関数内で静的な

それは宣言する場所で変わる
関数の外で宣言すれば大域
関数の中で宣言すれば関数内のみ

728 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 20:39:05 ]
関数内でも大域にならない?

729 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 20:44:34 ]
寿命はそうだがスコープは地が宇部

730 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 20:49:33 ]
なんで意味合いの違うものに両方staticなんて割り当てたんだろうな。
ファイルローカルはexternに対してinternalとかにすりゃよかったのに。



731 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 20:56:39 ]
C++では無名名前空間で対処したな。

732 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 21:05:53 ]
>>725ですが
ちょいとまだ把握できてないです

void main(){
int hoge[400000];だとアウトで
static int hoge[400000]; だと領域が確保できて

}

教えてくれた人が「static使うと、たくさん取れるよ」と言ってくれたので調べたのですが
どうもそういうことが見当たらなくて「静的な」とか。

上のような使い方は間違ってますか

733 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 21:11:25 ]
それは、static つけないとスタック領域を使うし、
スタック領域は他と比べるとかなり小さいから。

まあ恒久的なプログラムじゃなくて、一時的な使い捨てプログラムのときはそうやることもある。

734 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 21:32:40 ]
つまり、staticつけると
大域変数と同じところのメモリ領域を使うということですか。



735 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 22:02:25 ]
そゆこと

736 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 22:08:02 ]
了解しました!

737 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 02:32:24 ]
>>733
メモリ制限厳しい組込みとかだと普通にやるよ。
まぁでもソコまでだと、外部変数のバッファを使いまわしてチューニングする方が多いかも。
そんなんやりたく無いんだけどね・・・ハードコスト削減には勝てんわ。

738 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:09:17 ]
音声出力のソースを作っています。
以下のソースで、ファイルは出力されるのですが、音声が出てきません。
どこを修正すればよいか教えていただけませんか?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define SIZE 22050*5
#define OFFSET 23
int main(int argc,char *argv[])
{
FILE *fp;
short int inbuf[SIZE];
short int outbuf[SIZE];
int i,f,f0,amp,PI;
f = 440;
f0 = 11050;
amp = 5000;
if((fp = fopen("test-sound-16-22.wav", "rb")) == NULL ) {
printf("ファイルオープンエラー\n");
exit(EXIT_FAILURE);
}

739 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:10:09 ]
続き

fread(inbuf, sizeof(short int), SIZE, fp);
fclose(fp);
for (i=OFFSET; i<200; i++)
printf("%d, ",inbuf[i]);
printf("\n");
for (i=0; i<OFFSET; i++)
outbuf[i]=inbuf[i];
for (i=0; i<(SIZE-OFFSET); i++){
outbuf[i+OFFSET] = amp * sin(2*PI*i*(f/f0));
}
for (i=(SIZE-OFFSET); i<SIZE; i++)
outbuf[i]=0;
if((fp = fopen("testfile2.wav", "wb")) == NULL ) {
printf("ファイルオープンエラー\n");
exit(EXIT_FAILURE);
}
fwrite(outbuf, sizeof(short int), SIZE, fp);
fclose(fp);
return 0;
}


740 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:15:12 ]
>>738

音声を出力するところがどこにもないじゃん。




741 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:15:13 ]
出力された音声はどんなふうになってる?
あとsin()の中intになってないか?

742 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:15:43 ]
音声→音声ファイルね

743 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:25:55 ]
>>738
PIの初期化してないじゃん。ちゃんとデバッグしてんの?

744 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:29:16 ]
そーだ、それも書くの忘れてたw

745 名前:738 mailto:sage [2008/01/12(土) 13:29:36 ]
これとほぼ同様のソースで、2倍の周波数(以下のソース)で出力するものは、
きちんと出力されて、音声も出ています。
正弦波の合成はなぜか出来ない・・・

>> 740
音声ファイルを出力するところがないとは?音声ファイルは出力されていますが・・・

>> 741
出力された音声ファイルは何も発音がありません。
ファイルのサイズはきちんとあるので、データは自体は出力されていると思うのですが・・・

for (i=0; i<(SIZE-OFFSET)/2; i++) {
outbuf[i+OFFSET]=inbuf[i*2+OFFSET];
}
for (i=(SIZE-OFFSET)/2; i<SIZE; i++)
outbuf[i]=0;

746 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:29:48 ]
math.hにPIが定義してあるのかとおもったが、そうでもないな

747 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:30:48 ]
とりあえずPIの定義と、sin()の2を2.0にしてみ

748 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:38:51 ]
何も言わずにコピペだとマルチうぜーとか言われそうなもんだけど、ここの住人は優しいんだな

749 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:53:05 ]
>>745
デバッガで変数の値見ながら実行すればすぐに分かりそうなもんだけど。

750 名前:738 mailto:sage [2008/01/12(土) 14:09:29 ]
解決できました。皆さんありがとうございます。



751 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 06:12:14 ]
構造体で
氏名
年齢
住所
が入る変数を宣言しその構造体の配列を10人分用意しループで順番に入力してもらい氏名、住所、年齢に
空ENTERが入るとループを終了するということをしたいのですが。

全ての項目に空ENTERが入力されるとループを終了するという所をどのように書けばいいのかわかりません。
教えて下さい。


752 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 06:37:02 ]
>>751
空ENTERが入力されたかどうか判別するプログラムは作れるのか?

753 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 10:41:06 ]
>>751
氏名をfgets関数で入力し、strlen関数で氏名の文字数を求め、それがゼロだったら終了

754 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 12:34:26 ]
fgetsってファイル関連の関数じゃないの?
文字入力として使えるの?

755 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 12:37:19 ]
えー

756 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 12:43:11 ]
>>754
っ stdin

757 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 13:34:55 ]
printf()とかputs()とかscanf()とか全部廃止して、f****()に統一すりゃいいのに。
ストリームの概念が理解しやすくなる。

758 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 13:48:56 ]
f***()とか全部廃止してopen/close/read/writeにすれば良いのに。
ディスクリプタの概念が理解しやすくなる。

759 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 13:54:48 ]
もう開く/閉じる/書く/読むでいいよ。

760 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 13:56:07 ]
それなんてinterface?



761 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 14:14:31 ]
LISP だと以下のようにして定義できるが

(defun 開く (file-name mode &optional perm) ...)
(defun 閉じる (file-desc) ...)
(defun 書く (file-desc buff buff-size) ...)
(defun 読む (file-desc buff buff-size) ...)

まぁ, スレ違いだわな


762 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 17:50:32 ]
スレ違いに値しますが、どなたかtabキー送り幅の設定方法を教えて下さい
8マスから4マスに変えたいです

763 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 17:51:57 ]
>>762
環境による。また、アプリケーションの設定にもよる。

764 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 17:52:18 ]
スレ違いすぎるwww
エディタによる、いやそもそもエディタの話なのかも知らんが

765 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 17:52:22 ]
それは表示する側の問題だろ。Cの範疇じゃ無理。
使ってるOSと端末くらい書け。

766 名前:デフォルトの名無しさん [2008/01/14(月) 00:21:01 ]
教えてください


int main(void)
{

char *c1;

{
char *c2;

c1 = StoA(1000);
c2 = StoA(2000);

printf("c1 : %d\n", c1);
printf("c2 : %d\n", c2);

}

return 0;

}

このプログラムを実行すると、 なぜかc1の値がc2の値と同じになってしまします。

なぜなのか教えてください。

767 名前:デフォルトの名無しさん [2008/01/14(月) 00:22:24 ]
***追記***

ちなみにStoA関数は数値を文字列に変換する関数です。

768 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:22:35 ]
StoAって何だよ

769 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:23:33 ]
StoAの中身書いてないわろた

770 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:24:04 ]
どうみてもStoAが悪いだろw



771 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:35:00 ]
どうみてもStoAが悪い。
あと
>printf("c1 : %d\n", c1);
>printf("c2 : %d\n", c2);
%sちゃうのか?

で、同じ数値になるってところからサイコメトリーすると、
グローバル変数かローカル変数辺りの配列のポインタを返してると見た。
コール時にバッファ渡すか、StoAでmallocしてmainでfreeするかしたまい。
StoAを作るのが目的でないならsprintfかitoaでも使え。(個人的にはsprintf)

最後に、C言語で数値を文字列に変換する関数は「ItoA」か「ItoS」な。
StoAだと何してんだか訳分からん。

772 名前:デフォルトの名無しさん [2008/01/14(月) 00:42:07 ]
すんません%sでした"汗

StoAはshort型からアスキーコードに変換する関数です。

int main(void)
{
char *c;
c = StoA(123);
printf("%s\n", c);

return 0;
}

だと正常に動きます。


773 名前:デフォルトの名無しさん [2008/01/14(月) 00:44:08 ]
mainの中にあたらしいブロックを作ってその中で*c1をつかうのがなんかしらダメなんじゃないかなと思うんですが。

作るのが目的ではなくてなぜこうなるのか説明するのが目的なのでよろしくおねがいします。

774 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:45:06 ]
いいからStoAの内容書けよ

775 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:46:24 ]
>>772
んなこた良いからさっさとStoAのソースを貼れwww

776 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:48:09 ]
StoAのソースコードは守秘義務の関係上公の場に貼ることは出来ません。
無茶な要求をしないでください。もう少し常識をわきまえて。

777 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:48:59 ]
じゃあ分かりません帰ってください

778 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:49:16 ]
説明するのが目的なのか、説明してもらうのが目的なのかはっきりして欲しいな

779 名前:デフォルトの名無しさん [2008/01/14(月) 00:51:35 ]
>>776
その通りです。

ありがとうございます。

>>778

説明するのが目的なので分かりやすく説明してもらえると光栄です。

780 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:55:23 ]
とりあえず、StoAのソースを貼る気がないのなら終了で。



781 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:56:15 ]
>>779
c1 = StoA(1000);
c2 = StoA(2000);
printf("c1 : %s\n", c1);
printf("c2 : %s\n", c2);

↑で同じ値が出るんだろ?多分両方2000か?
c1 = StoA(1000);
printf("c1 : %s\n", c1);
c2 = StoA(2000);
printf("c2 : %s\n", c2);
これで同じになるか試してみ。
違う値になるようなら、多分StoAがstatic変数かグローバル変数のバッファ使ってる。
printf("%p, %p\n", c1, c2);
で同じ値が出てくるはず。

そうじゃなきゃ、自分でデバッグしてくれ。
ソース無しじゃお手上げ。


782 名前:デフォルトの名無しさん [2008/01/14(月) 01:14:31 ]
正直いいますと今手元にソースが無いのでかけませんが、覚えてる範囲で流れを書きます。

処理@
引数の桁数を調べる
(引数が12345ならiDigに10000を入れておく)

処理A
pStrにcStrのアドレスを入れて
数値を文字コードに変換して*pStrに格納。

処理B結果をかえす。

ちなみにcStrはstatic変数です。

わかりにくくてすいません"汗






783 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:16:48 ]
StoAがわかったら説明してやんよ

784 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:18:02 ]
そら二回目の呼び出しで cStr の内容を上書きしてるから
同じのが表示されるの当たり前でんがな。

バッファをローカルで持って、引数で渡すといいよ。

785 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:36:21 ]
ある時間,たとえば10時20分50秒になったらAの動作を行うというプログラムはどう作れば良いですか

ひとつの方法としてtimeを使って,現在の時間を取得し続け時間になれば動作する方法
これだとずっと時間を取得し続けるので,良くないような気がするので・・・

ちなみに環境はFedora,gccです.

786 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:39:22 ]
cron に投げれば

787 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:43:59 ]
sleep(指定時間-現在の時刻)
すりゃいいだろ。
ま、ふつーにcron使えと。

788 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:47:34 ]
本人の振りしてあおるのもうやめろよwwwみんな耐性ついてるんだしwwwww

789 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:48:44 ]
>>786
ありがとうございます.ちょっと調べましたがcronは使えそうです.
あとは,外部から動作する時間の変更が行われるので,それが出来るか調べて見ます.

自分のプログラムだけで実現できると一番良いですが・・・

790 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:51:44 ]
sleepの方法も考えましたが,時間の変更を行うことがあるので実現しにくいと思いやめました
やはりcronを使わないとしたらこの2つですかね



791 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 02:02:11 ]
コンソールアプリケーションの画面を何も表示されていない真っ黒の画面に
戻したいんですが方法を教えてください。

792 名前:785 mailto:sage [2008/01/14(月) 02:04:17 ]
cron調べましたが使えそうです
ありがとうございました

793 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 02:04:31 ]
OSに依存する

794 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 02:36:42 ]
>>791
winだったら、system("CLS");

795 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 02:38:30 ]
>>791
win以外ではエスケープシーケンスとか

796 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 04:25:03 ]
clearコマンドが使える場合もあるけど、鼬害。

797 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 10:50:14 ]
sysytem("cls")だとちらつきがひどいんですが
ちらつかないようにって可能なんでしょうか。
もし可能であるならばどうやればいいのでしょうか。

798 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 10:53:06 ]
ちらつきって

コンソールでゲームでもつくってんのか?


799 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 10:55:58 ]
エスケープシーケンスなりCursesなりコンソールAPIなり好きなの使っとけ
細かい制御が必要なら環境かけっつうの

800 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 10:56:23 ]
毎回書き換えが必要な所のみ書き換えるか
全画面を一度に書き換えるか。

どちらにしろ標準関数だけじゃ辛いので、
こういった関数を使うしかない。
msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpfileio/html/Toppage_Console.asp



801 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:26:59 ]
ちょっとしたゲームをつくっています。
環境はWinです。

同じ文字列が右から左に移動していき左端にきた文字は消えていくというのをしてるのですが
おもったようにちらつきを消すことができまちぇん。。

802 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:40:12 ]
>>801
消さずに上書き。
変化の無い部分は書き換えない。


803 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:48:49 ]
う、うわがき・・・
上書きってどう書けばいいのかわかりません。。。。
ちょっとした例示してもらえませんか?

804 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:49:56 ]
消したい文字列と同じ座標にスペースか何かで上書きするとか

805 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:58:06 ]
// >>801
#include <stdio.h>
#include <string.h>

void func(int width, const char * str)
{
int len = strlen(str);
for (int ic = 0; ic <= len; ++ic) {
printf("\r%*.*s", width, ic, str);
fflush(stdout);
sleep(1);
}
for (int ic = 0; ic < width; ++ic) {
printf("\r%*s%*s", width - 1 - ic,
ic < width - len ? str : str + ic + 1 - width + len,
ic + 1, "");
fflush(stdout);
sleep(1);
}
}

int main()
{
func(20, "abcde");
return 0;
}

806 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 12:41:05 ]
int main(int argc, char **argv){
FILE *fp;
int i, j, a, b;
short int image[HEIFGT][WIDTH];
上のプログラムを一行ずつ何をしてるんですか?

a = atoi(*argv[1]);
b = atoi(*argv[2]);

807 名前:806 mailto:sage [2008/01/14(月) 12:42:21 ]
あと下の
a = atoi(*argv[1]);
b = atoi(*argv[2]);
も教えてください

808 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 12:49:27 ]
Windowsでもcurses使えるんだっけか?

809 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 12:54:39 ]
>>808
移植はされてると思う。

810 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 12:56:27 ]
>>807
プログラムの起動時に渡されたコマンドラインの引数を、数値に変換してるんだけど、それだとバグっていて動かないね。



811 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 14:19:43 ]
806の日本語がバグっとる

812 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:12:11 ]
変換前:This
変換後:hisTay
変換前:is
変換後:siay
以下のコードで上のように出力して欲しいのですが上手くいきません
何故でしょうか?

int main() {
int i;
char s[256] = "This is a pen", *word;
word = strtok(s, " ");
printLatinWord(word);
word = strtok(NULL, " ");
// wordに"ay"が入る。何で?
printLatinWord(word);
return 0;
}

void printLatinWord(char *word) {
char *alp;
/*
通俗ラテン語風に変換して出力
※先頭の文字を末尾に移し、その後ろにayを付加する。
*/
printf("変換前 : %s\n", word);
strncpy(alp, word, 1);
alp[1] = '\0';
strcat(word, alp);
strcat(word, "ay");
printf("変換後 : %s\n", &word[1]);\
}

813 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:29:28 ]
>>812
char *alp;
ポインタにぶちこむな
char alp[1000];
的な感じにしないと

814 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:32:59 ]
>>812
strtokは、与えた文字列(この場合s)の中を書き換えながら、そこを指すポインタを直接返す。
たとえば、"This is a pen" を与えると、strtokは最初
"This\0is a pen"
 ↑
ここを返す。文字列は\0で終わる決まりなので、"This"が得られる。2回目は
"This\0is\0a pen"
         ↑
ここを返す。"is"が得られる。3回目は
"This\0is\0a\0pen"
              ↑
            ここを返す。"a"が得られる。
こういう動作なので、帰ってきた文字列に直接strcatで追加すると、
後ろの文字列(=次に返される文字列)が書き換わってしまう。
つまり、そのprintLatinWordを実行すると、sの中は
"ThisTay\0a pen"
のように書き換わり、次にstrtokが返すはずだった "is" は "ay" になってしまう。

815 名前:812 mailto:sage [2008/01/14(月) 16:42:27 ]
>>813
なんとなく*alpになってしまいました
まだ違いが良く分かってないので頑張って勉強します

>>814
wordを書き換えるとsも変わってしまうんですね。なるほど
丁寧にどうもです
*wordをword[256]に、word = strtok(s, " ");をstrcpy(word, strtok(s, " "))に直して上手くいきました

816 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:55:04 ]
大学の課題で一部分からない点があるので、よろしければヒントをお願いします。

#include<stdio.h>
#define MAX 10

int inputnum(int num[]){
int i;
for(i=0;i<MAX;i++){
scanf("%d",num[i]);
}
return num[];
}

int main (void){・・・・・・と続くのですが、
上記のサブ?ルーチンに表記の間違いがある場合、修正せよという問題です。
ですが配列の返し方など全て自習ということでここで止まってます…。
構文にエラーがあるというところまで分かっているのですが、
どうすえればいいか分かりません。ご教授願います。 orz

817 名前:816 mailto:sage [2008/01/14(月) 16:56:30 ]
For文が見にくくなってしまいすいません…。
よろしくお願いします。

818 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:59:05 ]
void inputnum(int num[]) {
int i;
for(i=0; i<MAX; i++) scanf("%d", num + i);
}


819 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 17:00:36 ]
>>816
return 0;とでもしておけ
返さなくても渡された中身は書き換わってる
なんでかはポインタについて勉強せんと・・

820 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 17:06:48 ]
scanf("%d", &num[i]);
もでした



821 名前:816 mailto:sage [2008/01/14(月) 17:17:55 ]
>>818,>>820
丁寧にありがとうございます。

>>819
ということは>>818の通りvoid宣言でいいのですね…。
後でじっくり調べてみます。ありがとうございます。

822 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 17:21:48 ]
int inputnum(int num[], size_t num_size)
{
    int i;
    for(i=0; i<num_size; i++)
        if(scanf("%d", &num[i]) != 1)
            return 0;
    return 1;
}


823 名前:816 mailto:sage [2008/01/14(月) 17:58:20 ]
>>822
すみません、「size_t num_size」とは何でしょうか?
また戻り値がどこの変数へ戻るのか分かりません…。


また1つ分からない事があるのでどなたかご教授お願いします orz
サイズを指定せずに配列を作る事は可能でしょうか?
int num[];
//これでは要素が無いためサイズが0であるのでできないということまで
分かりましたがそれ以上で詰まっています。
よろしくお願いします。

824 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:04:39 ]
>>823
size_tは型。たぶんunsigned intと同じである環境が多いのかな?
要は自然数用型とか思っとけばとりあえずOK。(サイズにマイナスはないからね)
戻り値がどこに入るかは呼び出し側次第。

int func( void )という関数があったとして
main内で「int a = func( );」 としてればfunc内の戻り値がa内に入る。

825 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:06:53 ]
>>823
サイズを指定しない配列は無理

malloc系を使えば好きな大きさで確保したり、大きさ変えたりはできるけど

826 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:08:05 ]
char s[] = "もけあ";
とかはできるけどそれは宣言のときだけね

827 名前:816 mailto:sage [2008/01/14(月) 18:32:46 ]
>>824
詳しくありがとうございます。
int inputnum(int num[], size_t num_size)
メインルーチンの方で上の2つの変数の値を指定すればいいということですね。

>>825-826
明確にありがとうございます。
入力する回数を予め決めるか、
要素次第ということですね。大変参考になりました。

皆さんありがとうございました。

828 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:59:16 ]
int func(int num){

return !(num%2);

}

上記の関数でnumが奇数の場合と偶数の場合の戻り値はそれぞれどうなりますか?
有識者の方宜しくお願いします。

829 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:59:55 ]
タメセカス

830 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 19:06:49 ]
算数じゃん。



831 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 19:07:11 ]
>>828
何がわからんのだ?%演算子か?!演算子か?
関数や戻り値がわかってるのならどっちかだろうな。
num = 2;
num % 2 == 0;
!0 == 1

num = 1;
num % 2 == 1;
!1 == 0;
こんなもんでわかるだろ。
ってか>>829で良かったかな。

832 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 19:08:07 ]
自己顕示欲・・・

833 名前:816 mailto:sage [2008/01/14(月) 21:14:46 ]
すみません。また1つ疑問ができてしまいましたのでご教授お願いします… orz

配列inputのサイズ変数MAXをサブルーチンで決定したいのですが、

int MAX;
void sub(int MAX){
  scanf("%d",&MAX);
}

int main(void){
  input[MAX];



}

とした時に、「sub(MAX);」をどこで定義すればいいのでしょうか?
それともルーチンではできないでしょうか?
よろしくお願いします orz

834 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 21:18:07 ]
(^ん^)?

835 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 21:18:29 ]
とりあえずC言語における「定義」の意味を調べなおした方が

836 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 21:19:26 ]
日本語でおk

MAXの値はどこでも変えられるけど?
MAX = 4;とか好きにすれば?
それとも配列のサイズ変えたいの?

837 名前:816 mailto:sage [2008/01/14(月) 21:19:52 ]
>>833訂正です、すみません。

void sub(int MAX){
  scanf("%d",&MAX);
}

int main(void){
  int MAX, input[MAX];



}

838 名前:816 mailto:sage [2008/01/14(月) 21:22:24 ]
>>835
すみません、定義ではなく呼び出しでした。ご指摘ありがとうございます。

>>836
サイズを入力で指定したいのですが、そのプログラムはサブルーチンで記すことが条件です。

839 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 21:25:06 ]
>>833
若干エスパー。
丸写しはどーかと思うけど、こういうことか?
void sub(int *MAX){
  scanf("%d",&MAX);
}

int main(void){
  int MAX;
  int *input;
sub(&MAX);
  /* int input_NG[MAX] <- これはムリ。配列の宣言では定数しか使えない */
  input = malloc(MAX * sizeof(int));



  free(input);
}


840 名前:816 mailto:sage [2008/01/14(月) 21:37:44 ]
>>839
ご回答ありがとうございます。
分かりづらくなってしまい申し訳ございません。

int MAX = 10;
int main(void){
  int main[MAX];




このように、最初から数値を指定するのではなく、
MAXの値をscanf等の入力で毎回変更することはできませんか?
またできる場合、それをサブルーチンでまとめられますか?


イメージはこんな感じになります。
scanf("%d",&MAX);
int input[MAX];

何度もすみませんがよろしくお願いします。



841 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 21:53:30 ]
>>840
一応そのイメージで839を書いたんだけど・・・。
要はmallocを使いたくない(or知らないので分からない)ってこと?

どうしても配列ってことであれば、おそらく分からないだろうけど
C89ならムリ。C99なら出来る。
つまりコンパイラによる。
例えば俺が知ってるうちではVCでは出来ない。gccは最近のであれば出来る。

842 名前:816 mailto:sage [2008/01/14(月) 21:53:33 ]
>>839
/* int input_NG[MAX] <- これはムリ。配列の宣言では定数しか使えない */
すみませんようやく意味が分かりました。
本当に詳しくありがとうございました。

843 名前:816 mailto:sage [2008/01/14(月) 22:01:13 ]
>>841
#include <stdlib.h>とセットでちらっとだけ見た事があるので
調べて分かれば使えると思いますが、分からないということでお願いします。

別のプログラムで指定した値をファイルに出力し、当プログラムで読み込むというような方法はあるのでしょうか?

844 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 22:08:52 ]
>>843
とりあえずfopen辺りでファイルの入出力ができるよ(他にもあるけど)
それも分からないの?

845 名前:816 mailto:sage [2008/01/14(月) 22:17:29 ]
>>844
そこは以前にある程度習っているので復習すればできると思います。
ありがとうございます。

846 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 22:18:52 ]
>>843
>調べて分かれば使えると思いますが、分からないということでお願いします。
お願いされてもwww
とりあえず十分に大きい固定サイズの配列を用意するか、
mallocを調べるのが良いと思うよ。

847 名前:816 mailto:sage [2008/01/14(月) 22:34:59 ]
>>846
>お願いw
すみません余計でした^^;

>固定サイズ
とても参考になりました。
0〜固定サイズまでで値を指定することならできそうです。
ありがとうございました。

時間があればmallocを扱えるようにしたいと思います。

848 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 16:44:03 ]
質問。
ハッシュ法について勉強してるんだけど、格納されたデータ(学籍番号と氏名)を読み取る際に、学籍番号の数(生徒数)を読み取る部分的なプログラムが分かりません。
どういう構文使えばいいでしょうか?
読み込みはこんな感じです↓
/* データファイルの読み込み */
if ((fp=fopen("DATA","r"))==NULL){
printf("File \'DATA\' is not found !\n");
}


while ( fscanf(fp, "%d %s", &data_zipcode, data_address) > 0 ) {
printf("%d : %s\n", data_zipcode, data_address);
/* データの格納 */
if ( StoreData(data_zipcode, data_address) == 0 ) {
printf("Hash Table is full !\n");

}
}
fclose(fp);

849 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 17:05:19 ]
>>848
ファイル内のデータの総数を知りたいなら、一回空読みすればよかろ。
つーか、それってハッシュ法と関連するのか?

850 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 17:50:05 ]
>>849
ハッシュするための下準備。んで、出来ました。ありがとうございました。



851 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 20:06:23 ]
if ((fp=fopen("DATA","r"))==NULL){
printf("File \'DATA\' is not found !\n");
}

いっつも思うんだけどさ、これって何したいの?

ファイルオープン失敗したまま処理続けるなよ

852 名前:N [2008/01/15(火) 20:07:27 ]
ナップザック問題を解説付きで教えてください。

853 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 20:17:11 ]
>>851
その箇所だけならなんとも言えんだろーがw

854 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 21:25:42 ]
#include <stdio.h>
#include <stdlib.h>

#define MAX_LINE 128

int main(void);

int main(void)
{
char buf[MAX_LINE];
int n;

printf("降水確率を入力してください。\n");
gets(buf);
n = atoi(buf);
ptintf("降水確率は %d %% です。\n", n);
if (n >= 50){
printf("傘を忘れずにね。\n");
}
else {
printf("傘はいりません。\n");
}
printf("いってらっしゃい。\n");

return(0);
}

/*これ↑のどこが悪いのか教えてください*/

855 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 21:31:57 ]
gets(),ptintf,return(0);

856 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 21:47:31 ]
ていうかなんでmain関数にもプロトタイプ宣言してんの?

857 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 22:01:51 ]
>>852
ググった方が早いと思うよ。
検索ワードはナップザック・ナップサック・動的計画法とかで
アプレット使った図解解説ページがあったと思う。
C言語の質問というよりアルゴリズム全般、数学の方が分野としては近いと思う。

858 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 22:39:47 ]
mainクソワロタwwwwwwwwwwwwwwww

859 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 01:21:59 ]
>>854
>/*これ↑のどこが悪いのか教えてください*/
降水確率が40%でも傘を持たせない根性。

860 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 07:03:52 ]
グレゴリウス暦の定義を利用して入力された日は何曜日か計算するにはどうしたらいいでしょうか?




861 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 07:28:06 ]
>>860
つ[time.h]

862 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 07:31:21 ]
>>860
ツェラーの公式

863 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 08:29:24 ]
>>860
適当な起算日からの日数を計算して7で割ったあまりを得よ。

864 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 16:44:51 ]
typedef struct{
int data[100];
} test;

int func(const test *x);

int main{
test data;
... //省略
for(i=0; i<10000; ++i){
int temp;
temp = ...; //省略。dataの要素を使ったなんかやたら複雑な計算
func(&data);
printf("%d", temp);
}
return 0;
}

ちゃんとしたコンパイラなら、
funcの引数がconstポインタだからループ中でdataの値は変更されない、と解釈して
毎回やたら複雑な計算をするようなことはしないように最適化してくれますよね?

865 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 16:48:20 ]
ちゃんとしたコンパイラがあればね。

866 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 16:57:04 ]
ないんですか?
たとえばVCとかgccではどうですか。

867 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 17:03:13 ]
自分で確かめろ

868 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 17:18:47 ]
いやgccもVCも持っていなくて……
アセンブラも読めないし

869 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 17:21:57 ]
なら入手して確かめればいいじゃん。

870 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 17:22:36 ]
constなんかキャストすればいくらでも外せるからな・・・最適化してしまうわけにはいかんような気がする



871 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 17:42:48 ]
>>864
そんな保証はどこにも無いから素直にループの外に出しておけ。
自分の為だけなら好きにすりゃいいけど、他人が読むなら言いようの無い不安感
(このコードを書いた奴はまともな人間知性を持っているのか・・・他にも問題ありそうだな・・・)
を煽るだけだからやめておけ。

872 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 17:47:40 ]
ループの中で毎回計算しないものを、ループに入れる神経がわからない。

873 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 17:59:29 ]
>(このコードを書いた奴はまともな人間知性を持っているのか・・・他にも問題ありそうだな・・・)
あるあるw

874 名前:864 mailto:sage [2008/01/16(水) 20:11:05 ]
要するに最適化してくれないということですね? ありがとうございます。

それと、「const*って最適化に使われているのかな」という疑問が唐突に湧いてきたので質問したものでして、
別にこのコードを実際に使うわけでもないのでいろいろとご安心ください。

875 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 20:16:37 ]
一度計算した結果はまた同じになることが保証されてるのは関数型言語だけだからな。
Cは最悪裏でサブスレッドがなんかやってるかもしれないし最適化には限界がある。

876 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 20:25:22 ]
>>874
const*自体は最適化のヒントに使われているよ。
ただ、>864のケースでは使ってないと思うけど。

877 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 20:43:46 ]
>>864
その最適化はまともなのか?


878 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 20:48:22 ]
txtファイルの中にある100を探し出してカウントするプログラムを書かないといけないのですが
100を見つけるたびに一つカウントしていくプログラムを組む場合どのような事をすればいいのでしょうか

879 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 20:50:14 ]
char *sの中から100を検索するコードを書け
それを一行に複数あっても見つかるように拡張しろ
それを複数行に対応させろ
いじょ

880 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 23:57:56 ]
十分に大きな配列を用意
txtファイルを読み込む
strstrでNULLがでるまで検索
検索した回数を数えればおk



881 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 02:20:28 ]
ありがとうございます
やってみます

882 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 04:31:11 ]
でかい配列なんてイヤだっていうならこんな方法もある。

char buf[4] = {0};
int ch, cnt = 0;

while((ch=fgetc(fp)) {
buf[0] = buf[1];
buf[1] = buf[2];
buf[2] = ch;
if(atoi(buf)==100) cnt++;
}


883 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 04:31:54 ]
while((ch=fgetc(fp))!=EOF)だった。

884 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 06:32:40 ]
>>882
っ 1000

885 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 06:52:16 ]
>>884
ばーかwww

886 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 07:47:18 ]
>>884
具体的に説明していただけませんか?

887 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 08:15:05 ]
>>884
僕には「100」が含まれているように見えますが・・・?

888 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 08:38:06 ]
buf[3]が常に'\0'であることに気付いてないのでしょう。

889 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 14:27:15 ]
int filename;

scanf("%d",&filename);
fopen("filename.txt","w");

キーボードから任意のファイル名でファイル作りたいんだけど
うまくいかないです。お願いします。

890 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 14:28:41 ]
char filename[32];

scanf("%s", filename);
fopen(filename, "w");



891 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 14:31:00 ]
>>890
どうもです
intじゃダメか…

892 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 16:44:02 ]
なぜintでいけると思ったんだよw

893 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 16:45:39 ]
int fileNo;
scanf("%d", & fileNo);
char fileName[100];
sprintf(fileName, "file-%d.txt", fileNo);

894 名前:884 mailto:sage [2008/01/17(木) 18:43:09 ]
これがフルボッコというものかwww

エスパー解釈して数値が並んでいるテキストから
特定の数値の個数をカウントするんだと思ったんだが違うのか?

>>878
テキストに含まれる "100" という文字列の数を数えたかったの?

895 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 18:46:50 ]
仮に>>878の真意が数値のうちから100を数えたかったとしても、
>>878だけしか書かれていない以上、>>882は十分な答えになってるだろ。

896 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 18:48:42 ]
っていうかそんな問題ならfscanf()で数値を読めばいいだけで悩むこともないと思うが。

897 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 22:06:17 ]
除算法を使ったハッシュ関数ってどうすればいいの?
一文字読み込むごとに割って余りを出してその余りを足していけばいいのかな?
で最後まで読み込み終わったらまた割って余りを出すという感じか?
全く見当違いのことを書いていたらすまん。

898 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 22:12:51 ]
>>897
ん?
ハッシング(Hashing)↓
www.u-gakugei.ac.jp/~miyadera/LECTURE/algo2/5-3.html

899 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 22:20:25 ]
>>898
それだ。
文章を読み込ませてハッシュ値を出したいんだが、>>897のような感じでいいのかな?

900 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 22:29:46 ]
精度を気にしないならそれでいい



901 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 22:35:26 ]
ありがとう。
一応考え方は間違っていないようで安心した。

902 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 23:26:26 ]
>>861-863
ありがとうございます
とりあえず前年度までの総日数と現在の総日数を出せたたのですが
そこからどうしたらいいのでしょうか?
for文とか使うんですか?

903 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 23:42:19 ]
>>902
ツェラーの公式

904 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 23:50:47 ]
1月と2月の計算に注意な

905 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 10:43:47 ]
まず基準となる日の曜日がわかってないとだめだよw

906 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 10:50:23 ]
だからそんなことしなくてもmktime()で教えてもらえばいいだろ。

907 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 11:18:52 ]
それで最初の質問の用件、「グレゴリウス暦の定義を利用」したことになるのか?

908 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 11:38:56 ]
>>902
1582年10月15日が金曜日だから、そこからの日数を7で割れば何曜日かわかるでしょ。

909 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 11:46:01 ]
>>907
Cの標準関数がグレゴリウス暦の定義を利用していないとでも?

910 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 11:52:28 ]
>>909
たとえそうでも、元の質問者の意図通りじゃないだろう



911 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 11:53:53 ]
標準関数は1970年以降しか扱えない時点で
グレゴリウス暦の定義を利用しているともしていないともいえない。

912 名前:902 mailto:sage [2008/01/18(金) 20:21:50 ]
とりあえずこんな感じの問題です
西暦1年1月は月曜日
1年は通常365日、閏年は366日
4で割り切れる年は閏年
400で割り切れる年は閏年
100で割り切れる年は閏年ではない

変数名関数名を作成
goto文は使用しない
関数途中でのreturnプログラム途中のexitはしない
外部関数は使用しない

913 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 20:29:48 ]
>西暦1年1月は月曜日
意味不明。

914 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 20:29:51 ]
>>912
丸投げするならこちらへどうぞ
C/C++の宿題を片付けます 101
pc11.2ch.net/test/read.cgi/tech/1197132472/
これは現行スレじゃないがな

915 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 00:09:54 ]
西暦1年とかまで考えようとしたら、
途中暦を正すために何日かすっとばしたのも考慮に入れるのけ?

916 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 01:14:29 ]
>>913
そうなんですか?
問題にはそう書いてあるのですが・・・
>>914
ありがとうございます
そっちでやってみます


917 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 17:16:00 ]
質問させていただきます。
ttp://www.geekpage.jp/programming/linux-network/multicast-2.php
このページで紹介されている様なUDP受信プログラムから、
受信したパケットの送信元IPアドレス(192…)を調べるにはどうすればよいでしょうか?

918 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 17:21:22 ]
>>917
recvfrom
pc11.2ch.net/test/read.cgi/tech/1186418855/

919 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 18:11:04 ]
>>918
おかげさまで解決できました。どうもありがとうございました。

920 名前:デフォルトの名無しさん [2008/01/20(日) 18:03:14 ]
C#厨です。C始めました。

#define A 1
#define B 2

int main(){
int i = A + B;
int j = A + B;
int hoge[i][j];
}



新規テキスト ドキュメント.c
新規テキスト ドキュメント.c(7) : error C2057: 定数式が必要です。
新規テキスト ドキュメント.c(7) : error C2466: サイズが 0 の配列を割り当てまたは
宣言しようとしました。
新規テキスト ドキュメント.c(7) : error C2057: 定数式が必要です。
新規テキスト ドキュメント.c(7) : error C2466: サイズが 0 の配列を割り当てまたは
宣言しようとしました。
新規テキスト ドキュメント.c(7) : error C2087: 'hoge' : 添字がありません。
新規テキスト ドキュメント.c(7) : error C2133: 'hoge' : サイズが不明です。

です。どうしたらいいでしょうか?



921 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:11:44 ]
C言語は変数を用いて配列の宣言はできひんのよ

922 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:17:43 ]
1. C++コンパイラの力を借りる。
拡張子cppにして、こういう風に書く

const int i = A + B;
const int j = A + B;
int hoge[i][j];

2. プリプロセッサの力を借りる。
#define i (A + B)
#define j (A + B)

本当に実行時まで変数の値がわからない時の話はまた今度。
お前の見ている本やWebサイトを読み進めていれば、その内出てくるだろうし。

923 名前:デフォルトの名無しさん [2008/01/20(日) 18:17:55 ]
>>921
なぬぅ!なんて使えない糞言語!
ユーザーの入力.etcによって必要なだけ配列を確保するにはどしたらいいん?

ポインタはいいとして(C#にもあるし)、プロトタイプ宣言とか、変数の宣言はブロックの先頭とか、
面倒な決まりが多いぜ…orz

924 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:19:04 ]
その例で無理矢理実現するなら。

#define A 1
#define B 2
#define i (A+B)
#define j (A+B)

int main(){
int hoge[i][j];
}

925 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:19:11 ]
>>923
mallocとか使え

926 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:19:52 ]
C++ の std::vector 使った方が

927 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:20:23 ]
まさに高級言語により生まれたゆとり世代。

928 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:20:45 ]
>>926
つ[スレタイ]

929 名前:デフォルトの名無しさん [2008/01/20(日) 18:22:06 ]
>>922
いあ、C#で書いた迷路の生成プログラムを移植してて、
コマンドライン引数で指定した迷路のサイズによって
2次元配列のサイズを変えたいのね。

コンパイラはVC++EEのコマンドライン使ってるのでC++のコードもおkだけど
出来ればCの範囲でやりたいでふ。

930 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:23:10 ]
>>925
麻呂?首ググって来る



931 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:23:12 ]
malloc 一択。
演算子のオーバーロードとかないから、
何かアクセス関数作っとけ。

932 名前:925 mailto:sage [2008/01/20(日) 18:23:14 ]
(´・ω・`)

933 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:25:02 ]
あらかじめ最大サイズを決めておくという手もなくはない。
エレガントではないが。

934 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:27:32 ]
gccで-std=c99使えばいいよ。

後の規格改定で、変数宣言の位置の縛りもなくなったし、
配列の要素数に変数が使えるようにもなった。
が、しかし、需要がなくてVisual C++は対応していない。

935 名前:920 mailto:sage [2008/01/20(日) 18:33:38 ]
www9.plala.or.jp/sgwr-t/lib/malloc.html
この麻呂でいけそう。超thx!
これってフリー忘れるとプログラム終わってもメモリ使えないままなの?
だとしたら怖い。
C#は案セーフじゃなければ何やってもプログラムが落ちるだけだから何でも試せたのに。

>>934
それって、今のANSI?の規格なら出来るけどVCは遅れてる子だから駄目ってこと?
ならVC2階の窓から捨てる。

936 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:36:31 ]
>>935
フリーを忘れないようには
どうするといいかってのを
考えながらくむのも
おもしろいもんだよ

937 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:37:57 ]
>>935
プログラムが終了すればおk
C#のunsafeとほぼ一緒だと思うけど

938 名前:920 mailto:sage [2008/01/20(日) 19:09:27 ]
>>936
{書いたら直ぐに
}書いて、その間にコードを書くみたいに
麻呂したら直ぐにフリーして間にコード書いちゃ駄目?

>>937
よかた。ちゃっちゃいプログラムなら大事にはならなさそうね。

939 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 19:10:38 ]
いやいやいやいや、
終了すれば大丈夫だからって
放置する癖は付けない方がいいぞ

940 名前:920 mailto:sage [2008/01/20(日) 19:22:43 ]
>>939
それはだいぢょぶ。
ただ、びくびくしながら書いてたら上達しにくい気がするから心配だっただけ。

もひとつ質問していいかな。
int main(){
int hoge[10][10];
hoge[10][10] = 100;

poke(hoge);
return 0;
}

int poke(int *moge){
return *moge[10][10];
}

って平気?一次元だと出来たんだけど。
試してもいいかなぁ?



941 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 20:06:48 ]
mallocを麻呂って書くヤツはカス。

942 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 20:17:08 ]
>>935
大丈夫。VC++みたいなのが世の中の多数派。使う人間、誰もいないし。

たとえ解放し忘れても、プログラムが終了すればWindowsが丸ごと解放する。
あと、マネージドなプログラムで何やってもプログラムが落ちるだけというなら、
アンマネージドなCのプログラムだって、
何やってもプログラムが落っこちるだけで済むと言える。
9xのWindowsでもない限り。

943 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:26:32 ]
>>940
そもそもhoge[10][10]の参照はまずくないか

944 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:29:30 ]
mallocってなんて読むの?
えむあろっく かと思ってるんだけど

945 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:31:57 ]
>>944
宗教論争みたいになっちゃうけど人間関係に問題が起きない範囲で好きに読めばいいと思う。
俺は普段はまろっくって読んでる

946 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:40:08 ]
ネイティブはマロックって言うらしい
ソースは俺

947 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:40:51 ]
まろっくって読んでるけど個人でやってるから口に出した事ないな
プログラマだと口に出して言うことあるのか?

948 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:43:23 ]
動的確保!って叫んでる

949 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:43:26 ]
普段はC++だから口に出して言ったことは無いな

950 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:46:54 ]
【char】変な読み方するな その2【ちゃー】
pc11.2ch.net/test/read.cgi/prog/1177251487/

マジレスするとカタカナ表記でGoogle検索して多い方を使っておけばノープロブレム。



951 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:48:41 ]
ちゃーだと最近のクソ芸人のギャグまでひっかかる

952 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 22:45:34 ]
>>940
平気じゃない。
2次元配列を1次元配列にマップしたときのインデックスを計算汁。

953 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 22:50:46 ]
int hoge[10][10];

配列の最後は
hoge[9][9];
よってオタワ

954 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 22:53:56 ]
int poke(int (*moge)[10]){
return moge[9][9];
}

こういうのならいいんでしょうか・・?

955 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:08:57 ]
int poke(int moge[][]){
}
って感じにできなかったっけか?

956 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:10:32 ]
>>955
それはない

957 名前:920 [2008/01/20(日) 23:16:34 ]
>>952
でけた。THX
でも、こんなの読めないよ…。
hoge[2番目の長さ * 1番目の添え字 + 2番目の添え字]

hoge[1番目の添え字][2番目の添え字]
と同じだなんて気付きようがないぬ
もっと可読性が高い書き方はないかにょ…。

958 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:24:05 ]
>>955
最低でも int poke(int moge[][N]) の N が必要


959 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:36:12 ]
>>957
関数にすればいいじゃん

960 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:41:59 ]
>>957
>>954
の方法は?



961 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:45:25 ]
>>960
2番目の長さが固定になるだろ・・・

962 名前:デフォルトの名無しさん [2008/01/21(月) 00:49:55 ]
Cプログラマ必須テキストです!

mori.eco.to/

963 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 01:21:37 ]
マルチ乙としかいいようがないな

964 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 01:23:42 ]
ざっと見てみたけど自意識過剰サイトでわろた
しかもテキストごときに8000円とか誰もひっかからんだろwww

965 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 01:40:05 ]
在学中に情報系の国家試験である、基本情報処理技術者、ソフトウエア開発を取得

極普通じゃねーかwwwww

966 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 01:45:21 ]
ばかじゃねーの
8800円あったら専門書買うわーバーカ

967 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 02:05:24 ]
構造体の初期化で教えてください。

(1)
struct Type x = {.var = NULL};

(2)
struct Type *x;
x = (struct Type *) malloc(sizeof(struct Type));
x->var = NULL;

(3)
struct Type *x;
x->var = NULL;

とあって、(1), (2) だと問題ないのですが、
(3) だと segmentation fault になってしまいます。
どういう理屈からでしょうか?


また、構造体を 「*変数名」で宣言したときは、最初に値を設定するときに、
必ず malloc をしてからでないといけないのでしょうか?

よろしくお願いします。

968 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 02:07:49 ]
ポインタってのはどこかの実態をポイントしてなきゃアクセスできるわけがねぇ

969 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 02:08:12 ]
xはその構造体の型へのポインタだから

970 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 02:10:05 ]
>>967
ポインタがなんなのかまったく理解できてない

struct Type *x;
で用意されるのは構造体struct Type がどこにあるかを表す変数だけ
構造体の本体はない
mallocでそれを用意してやってる



971 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 02:26:02 ]
long と long int は何が違うんでしょうか

972 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 02:33:25 ]
いっしょです

973 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 02:33:43 ]
タイプ数

974 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 10:20:07 ]
音声を出力するにはどうすればいいのかな?

975 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 10:20:44 ]
環境書け

976 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 10:31:16 ]
センサーがあるのでそれで感知をした時に
音声を出力するプログラムを作るにはどうすればいいですか?

977 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 10:34:52 ]
センサーの入力を監視する部分と、音声を出力する部分を作ればいける

978 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 10:36:40 ]
音声の出力する部分を作るには
どうすればどのようなプログラミングを作ればいいですか?

979 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 10:40:22 ]
Cの標準機能じゃ無理だからOSとかコンパイラとかを書かないと答えようがない

980 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 14:33:40 ]
>>978
putchar('\a');



981 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 14:44:54 ]
>>978
「プログラミング」は作れません。

982 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 14:54:47 ]
>>978
音声合成とか勉強すれば...

983 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 14:56:35 ]
センサーって、組み込み?
それなら、周辺回路によるけどどこかのポートをパタパタ。


984 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 19:47:42 ]
>>978
window.hをインクルードしてBeep関数使えば鳴らせるよ






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<237KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef