くだすれC言語(初心者用) Part.2

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
このスレッドはC言語について、
他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
C使いが優しくコメントを返しますが、
お礼はC言語の布教と初心者の救済をお願いします。

くだすれC言語(初心者用)
http://pc10.2ch.net/test/read.cgi/tech/1153542424/
2デフォルトの名無しさん:2007/02/22(木) 08:37:42
2get
3デフォルトの名無しさん:2007/02/22(木) 10:10:06
裏切派遣って知ってる?
元々は正社員だったのに取引先にフリーのほうが稼げるとか騙されて派遣やってるバカのことw

前の会社を裏切り、結局派遣先からも騙されてる。
そもそも信頼されてるなら直接契約するか正社員にするはずだが、派遣会社経由って舐められ杉

自分でも騙され裏切れられてることは薄々わかってるから派遣問題の話が出るとウッキー!って逆ギレw
4デフォルトの名無しさん:2007/02/22(木) 17:06:10
保守
5デフォルトの名無しさん:2007/02/22(木) 22:28:47
printfってなんですか?
6デフォルトの名無しさん:2007/02/23(金) 00:54:40
関数の名前です
7デフォルトの名無しさん:2007/02/23(金) 00:57:26
半分は優しさでできています。
8デフォルトの名無しさん:2007/02/23(金) 02:21:25
D.リッチーのやさしさが詰まってます。
9デフォルトの名無しさん:2007/02/24(土) 11:52:39
doubleが数値であるかないか、つまりNaNやinfではないかどうかはどのように判定すればよいのでしょうか?
10デフォルトの名無しさん:2007/02/24(土) 11:54:40
fpclassify
11デフォルトの名無しさん:2007/02/24(土) 14:45:18
>>9
Double.isNaN
Double.isInfinity
12デフォルトの名無しさん:2007/02/24(土) 14:49:56
>>11
スレタイ嫁。
13デフォルトの名無しさん:2007/02/24(土) 15:10:31
最近思うのだが
C言語のreturn文てあまり使わないんじゃないの?
14デフォルトの名無しさん:2007/02/24(土) 15:12:34
?????
15デフォルトの名無しさん:2007/02/24(土) 15:15:35
最近思うのだが>>13
C言語の関数をひとつしか作らないんじゃないの?
16デフォルトの名無しさん:2007/02/24(土) 15:21:47
このへんはC99?
isnan,isinifnite
17デフォルトの名無しさん:2007/02/24(土) 15:22:14
引き数をポインターにして戻せば良いかなと思うんだけど
18デフォルトの名無しさん:2007/02/24(土) 15:31:32
>>16
isnanはC99要求だね。
isinifniteってのはないが、isinfがC99から
fpclassifyもだけど
19デフォルトの名無しさん:2007/02/24(土) 15:37:56
>>17
hoge( hage() ) みたいに、結果をそのまま他の関数に渡す場合は?
20デフォルトの名無しさん:2007/02/24(土) 15:56:32
関数なんて便利なものがなかった時代でもプログラマはなんとかやってたわけだからreturn使わなくてもなんとかなるだろ。
21デフォルトの名無しさん:2007/02/24(土) 16:06:16
なんとかならないから関数の概念が発達したんだろうに。
22デフォルトの名無しさん:2007/02/24(土) 16:46:57
time()みたいに引き数でも戻り値でも戻す奴もいるがな。
23デフォルトの名無しさん:2007/02/24(土) 18:11:44
関数を呼ぶときに必ず右辺値を要求されるのは鬱陶しくてかなわん。
24デフォルトの名無しさん:2007/02/24(土) 18:20:07
>23
どゆこと?kwsk
25デフォルトの名無しさん:2007/02/24(土) 18:33:39
左辺値を要求されると即値が書けずに鬱陶しいという話なら分かるが、
右だとなんだろ。

26デフォルトの名無しさん:2007/02/24(土) 19:47:41
>>25
たぶん、>>23が右と左の区別もつかない馬鹿なんじゃないのか?
27デフォルトの名無しさん:2007/02/24(土) 19:48:37
>>25
たぶん、>>23が右と左の区別もつかない馬鹿なんじゃないのか?
28デフォルトの名無しさん:2007/02/24(土) 22:34:02
printf()系の関数ってどうやって、
複数の型で値渡ししてるの?

int printf(const char *format, ...);

...っていうのが可変長引数っていうのまでは
わかったんだけど・・・

個人的予測では、void*で受けて、
*formatの内容で型キャストしてるのかなぁ・・・と。
29デフォルトの名無しさん:2007/02/24(土) 22:37:47
va_stratとかでググれ。
どうやっているかはコンパイラ次第でどうにでもできるようマクロで隠されている。
3028:2007/02/24(土) 22:44:04
>>29
そうすると、いろいろやり方があるって事ですか?

例えばでいいので教えてもらえませんか。
31デフォルトの名無しさん:2007/02/24(土) 22:53:38
可変長引数を受け取る方法は、
29の言うva_startなど<stdarg.h>にある一連のマクロを使うことになっている。

コンパイラは、可変長引数をどうやって実現していようと、
<stdarg.h>の内容を定められたとおりに実装しなければならない。

だから結局使う側は<stdarg.h>のマクロの使い方を知っていれば良く、
どうやって実現されているかということは知る必要など無い。
もちろん理解を深めるために知りたいとかそういう話は別だ。
3228:2007/02/24(土) 23:03:42
>>31
>>29さんはva_startの事を言っていたんですね。

stdarg.hを参照することにします。
有難うございました。
33デフォルトの名無しさん:2007/02/24(土) 23:10:35
でもって、可変長だと、実際に引数がいくつ、またどんな型で渡されたかは、
C言語的には判断できないので、printfのように%指定で判断する(だから%指
定の数やデータ型と引数にズレがあるとおかしなことになる)約束にするか、
型情報とデータをペアで交互に渡し、最後の引数として特定の値(NULLとか)の
ものを積むとか決めておく。
34デフォルトの名無しさん:2007/02/25(日) 19:44:27
質問失礼します。
Visual C++ 2005 Express Editionで、
C++のプログラムを作るには、
Visual C++ 2005 Express Edition
Microsoft Platform SDK
インストールした後はこれだけあればいいんでしょうか?

Microsoft MSDN 2005 Express Edition
Microsoft SQL Server 2005
Microsoft SQL Server Natibe Client
Microsoft SQL Server VSS Writer
Microsoft SQL Server セットアップ サポート ファイル

これらは必要ありませんか? 削除してしまっても大丈夫でしょうか?
PCを起動するたび、タスクマネージャを見ると
sqlserve.exeというのが100MB近くもメモリを使っているようなのです。
HDもかなりの量を使っているので、削除できるものがあれば削除したいのですが。
3528:2007/02/25(日) 21:44:12
>>28です。

詰まったので、又質問させていただきます。

stdarg.h内にてva_startを参照したところ__builtin_va_startに対して
マクロ定義されていたました。

__builtin_va_startとは、一体何者なのでしょうか・・・
検索したのですが、解説しているページがなく困っています。

よろしくお願いいたします。
36デフォルトの名無しさん:2007/02/25(日) 21:46:52
va_startマクロが何をラップしていようと知ったこっちゃない。
コンパイラの開発元にでも問い合わせとけ
3728:2007/02/25(日) 21:50:29
>>36
そういうもんですか。

ふぅ。
38デフォルトの名無しさん:2007/02/25(日) 22:57:30
>>34
どれも使わないなら削除してしまえ。
そもそもVC++のインストール時にインストールしないよう指定できる。

MSDNには関数リファレンスやコンパイラオプションなどの説明などが
入っているが、必要ならExpress付属のものよりも、
オンラインのものや別途ダウンロードのもののほうが良い。
http://www.microsoft.com/downloads/details.aspx?FamilyID=94596AF5-CC58-45AF-A14B-DF627A31E783&displaylang=ja
39デフォルトの名無しさん:2007/02/25(日) 23:10:18
>>28
va_arg が何をやってるかを低レベルで理解したいってこと?

関数の引数はスタックに積まれるので
最初の引数のポインタを渡すことで
それ以降の引数のアドレスを求めているだけ。
取り出すときは型情報を指定することでサイズがわかる。

stdarg.h 使わずに実装すると勉強になりますよ。
40デフォルトの名無しさん:2007/02/26(月) 01:19:22
>>38
どうもありがとうございます。
これですっきりします。
41デフォルトの名無しさん:2007/02/26(月) 01:35:15
>>35
おまいさんが使ってるのはgccかな?
このまわりの実装は処理系によって全然違う。
ANSI C に準拠していない古い処理系だと va_start に
引数がなかったりするようなヤツもある。
>>39 が言ってるのは一般的な処理方法の一つに過ぎない。が、
自分が使ってる処理系/環境でのこのまわりの動作を
理解できてれば↓こんなアホなこともできる。
http://mx1.tiki.ne.jp/~wraith/tips0005.htm
42デフォルトの名無しさん:2007/02/26(月) 05:00:15
用例1は未だしも、用例2はカス以下だな。
43デフォルトの名無しさん:2007/02/26(月) 20:33:44
>>42
>用例1は未だしも
そう思った、お前もカス以下だな。
44デフォルトの名無しさん:2007/02/27(火) 00:19:17
後のWM_(NC)CREATEのCREATESTRUCTを見ると、
WindowsのCreateWindow(Ex)はおそらく用例2を使っている。
だからどうしたということだが。
45デフォルトの名無しさん:2007/02/27(火) 21:56:35
よくポインタでつまずく、ポインタが難しいといわれてるけど、
ポインタ以前で難しいところやつまずきやすい所はどこ?
46デフォルトの名無しさん:2007/02/27(火) 21:59:37
環境設定
47デフォルトの名無しさん:2007/02/27(火) 23:06:48
パスを通すところだな
初心者がマニュアル読まず検索せず過去ログを読まずに
質問してくる
48デフォルトの名無しさん:2007/02/27(火) 23:22:02
しかも質問にはエラーを貼らないとか省略するとか独自解釈するとか。
49デフォルトの名無しさん:2007/03/03(土) 13:14:32
Cの勉強を始めるに当たり、参考書を買おうと思ってるのですが、
どれがいいのか教えていただけないでしょうか?
50デフォルトの名無しさん:2007/03/03(土) 13:27:10
51デフォルトの名無しさん:2007/03/05(月) 09:50:01
週明け早々お聞きしたいのですが
配列で、効率的にメモリ確保をしたいのですが、どうやればいいでしょうか。
具体的には

   ・・・・・・・・・・・・・・・
・・・・・・・・・・・   ・・・・・・・・・・・・
   ・・・・・・・・・・・・・・・・・・・
   ・・・・・・・・・・・・v

こういう座標群があったとして、それを配列に確保していきたいのです。
point[x][y]のように宣言して、左上から値がなかったら0 あったら1のように確保していくと
無い部分のメモリが無駄に取られてしまうので
座標がある部分だけ、確保したいのです。

図は二次元ですが、それを3次元でやりたくて、そこで詰まっています。
ご指南お願い致します
52デフォルトの名無しさん:2007/03/05(月) 09:51:36
すいません、上げてしまって。
他のスレの方が聞けそうなので、こちらの質問は撤回させていただきます。
すみませんでした
53デフォルトの名無しさん:2007/03/13(火) 15:13:44
strcatを使用しないでchar型配列(str1とstr2)を連結したいのですが、
文字列str1の最後の'\0'に文字列str2の0からを一つずつ代入していけばいいのは
分かるのですが、やり方がわかりません。
どうすればできますか?
54デフォルトの名無しさん:2007/03/13(火) 15:20:16
int main(void)
    char str1[10] = "STR1", str2[] = "STR2";
    char *p = str1, *q = str2;
    while(*++p);
    while(*p++ = *q++);
    puts(str1);
}
55デフォルトの名無しさん:2007/03/13(火) 15:31:17
>>54さん
ありがとうございます。
まだポインタのほうを勉強していないのでまだよく分からないのですが、
参考にしてみます。
56デフォルトの名無しさん:2007/03/13(火) 15:56:35
配列の知識のみで書くと、

int i = 0;
int j = 0;

while (str1[i] != '¥0') { i++; }

whle (str2[j] != '¥0') { str1[i] = str2[j]; i++; j++; }

str2[j] = '¥0';
57デフォルトの名無しさん:2007/03/13(火) 16:09:31
>>56さん
親切にありがとうございます。
ちゃんとできました。
58デフォルトの名無しさん:2007/03/15(木) 01:08:44
数値の桁数を得るのによい方法はないでしょうか?
たとえば、
int val = 7743;
とある場合、valは4桁というように。ただ、printf系は使わずに行いたいです。
10で割っていけばできるような気がするんですが、イマイチわかりません。
59デフォルトの名無しさん:2007/03/15(木) 01:11:02
桁数 = 1 + log10(N)
高校数学の知識だろ。
60デフォルトの名無しさん:2007/03/15(木) 01:13:34
中学生かも知れないじゃん。

int val = 7743;
int keta = 0;

int temp = val;
for (; temp > 0; keta++, temp /= 10);

ただし val > 0 のときのみ
6158:2007/03/15(木) 01:18:03
>>59-60
ありがとうございます。
62デフォルトの名無しさん:2007/03/16(金) 22:14:48
while(*p++ = *q++);

どうしてこれで文字列がコピーできるんですか。
63デフォルトの名無しさん:2007/03/16(金) 22:20:36
最後の¥0を含めて文字をコピーしてはポインタが進み、
¥0を代入したところで式全体の値が¥0つまり整数としては0になり、
偽と見なされるのでループが終了する。
6462:2007/03/16(金) 22:39:36
早速ありがとうございます。

もうちょっと教えてください。
カッコの中の「左++」「代入」「右++」では、必ず真ん中の「代入」から走るってことでいいですか?
左右の++が同期取れてないとずれちゃうんじゃないの、
ていうのが一番疑問なところなのです。
65デフォルトの名無しさん:2007/03/16(金) 22:43:09
++が後置されているときは、まず現在値を以降の式で
使うものとして控えてから1を加える。
前置なら1加えるのが先。
6662=64:2007/03/16(金) 22:52:40
>>65
納得しました。ありがとうございます。
67デフォルトの名無しさん:2007/03/17(土) 04:32:41
>62って書き換えると
do {
 *p = *q;
 p++;
 q++;
}while(*p);
ってことなんだよね。
初めて見たとき
while(*p) {
 *p = *q;
 p++;
 q++;
}
かと思ってなんで'\0'がコピーされるのかしばらく理解できなかったよ。
68デフォルトの名無しさん:2007/03/17(土) 05:10:29
シムラーセミコロンセミコロン
69デフォルトの名無しさん:2007/03/17(土) 11:30:27
>67
上のdoはwhile(*(p-1))じゃないと。
70デフォルトの名無しさん:2007/03/17(土) 11:36:56
寧ろどちらかというと
while (p[0] = q[0], p++, q++, p[-1] != '\0') ;
だな。
71デフォルトの名無しさん:2007/03/18(日) 00:06:29
#include<stdio.h>

int main(void)
{
FILE *fp;
fp=fopen("test.txt","w");
if(fp==NULL){
printf("エラー\n");
return 1;}

fprintf(fp,"ファイルに書き込みました。\n");

fclose(fp);

return 0;
}

このような処理を行う時に、return 1とreturn 0の違いはなんですか?
return 0で代用しちゃだめ?
72デフォルトの名無しさん:2007/03/18(日) 00:26:48
>>71
駄目じゃあないけど、
プログラムが正常終了したときに0を返し、
異常終了したときに0以外を返すのが慣習なので、
特段の理由がないときは慣習に従っておくのが得策。
73デフォルトの名無しさん:2007/03/18(日) 01:00:43
プログラムを呼び出すプログラムでは、呼び出して返ってきたときに
そのreturnの値を参考にするようになってることがある。
呼び出したプログラムが成功裏に動いたときに限って後続の処理を行うとか。

練習で作るようなプログラムでは実質的にはどんな数を返してもいい。
74デフォルトの名無しさん:2007/03/18(日) 01:00:45
CPad for Borland C++Compilerでプログラミングしています。

#include <stdio.h>

int main()
{
char str[] = "tanaka tarou";
char str2[100];
char *p,*q;
p = &str[0];
q = &str2[0];

while(*p != '\0'){
if((*p != 'a') && (*p != 'i') && (*p != 'u') && (*p != 'e') && (*p != 'o'))
*(q++) = *p;
p++;
}

printf("%s ---> %s\n",str,str2);

return 0;
}

文字列の子音だけを取り出して表示するプログラムを作りたいのですが、上記のプログラムを実行すると
tanaka tarou ---> tnk tr@
のように最後にまったく関係のない文字が表示されてしまいます。その理由と解決策を教えてもらえないでしょうか?
75デフォルトの名無しさん:2007/03/18(日) 01:06:19
str2に'\0'を入れ忘れているからじゃないか?
76デフォルトの名無しさん:2007/03/18(日) 01:32:01
printfの直前に
*q = '¥0';
7774:2007/03/18(日) 02:17:01
>>75-76
回答ありがとうございます!解決しました。
なんともないように見えることもあるみたいですが、\0が抜けているとこういった不具合が起こるんですね。
78デフォルトの名無しさん:2007/03/18(日) 10:30:31
自分で決めた位置に¥0を入れないと、「運良く」その先に¥0が入っている
ところが見つかるまでずーーーーっと文字列が続いていることになってしまう。
79デフォルトの名無しさん:2007/03/18(日) 13:44:10
整数はint型、文字はchar型を使うのが原則のようですが、
文字はコンピュータの中で数字で扱われていることと、
char型が0〜255、int型がそれ以上の範囲の数字を扱えることを考えると
文字を扱う時もint型でかまわないのでは?と思いました。
実際、int型で1文字出力できました。具体的には下です。

 int a;
a=getchar();
printf("%c\n",a);
return 0;

しかし、文字列をint型で扱おうとすると、コンパイル時にエラーとなります。

int a[50]="Hello";
printf("%s\n",a);
return 0;

なぜ、int型では文字列が扱えないのか理解できません。
80デフォルトの名無しさん:2007/03/18(日) 13:59:24
> a=getchar();
getcharはEOFも返すのでint型を返すと宣言されており、実は正解。
EOFの場合を弾いてからchar型として扱うべき

> printf("%c\n",a);
可変個引数では全てint以上に拡張されて引数が渡される規則。
char型の値を渡そうとint型の値を渡そうと正常に動いてしまう。

> int a[50]="Hello";
できないという規則になっているからとしか言えない。
int型の配列に文字列を無理やり入れる方法はあるが、
文字列を扱う関数はchar配列、つまりsizeof (char) == 1バイトずつ
文字がメモリに格納されることを前提にコードが書かれているので、
無理にint型の配列にしたところで、正しく動作しない。
81デフォルトの名無しさん:2007/03/18(日) 14:14:28
>int a[50] = "Hello";
これは、
int a[50];
a[0] = 'H';
a[1] = 'e';
a[2] = 'l';
a[3] = 'l';
a[4] = 'o';
a[5] = '\0';
とするか
int a[50];
for (int ic = 0; a[ic] = "Hello"[ic]; ++ic) ;
とすれば実装できなくは無いな。
82デフォルトの名無しさん:2007/03/18(日) 14:16:54
int a[50] = {'H', 'e', 'l', 'l', 'o', '\0'}; でいいじゃない
83デフォルトの名無しさん:2007/03/18(日) 15:13:05
>>80-82
ありがとうございます

char a[50]="Hello"; と char a[50]={'H','e','l','l','o','\0'};

は違うのでしょうか?
手持ちの本では、特に違いは書いてないのですが・・・
84デフォルトの名無しさん:2007/03/18(日) 15:18:10
"Hello" は char[] 型
{'H','e','l','l','o','\0'} は文脈によって char[] とも int[] とも解釈できる。
85デフォルトの名無しさん:2007/03/18(日) 15:23:15
"hello"のような文字列リテラルはchar配列を初期化するのに使える
(その場合{'H', 'e', 'l', 'l', 'o', '\0'}のように解釈する)
という規則が特別に設けられている。

だからint a[50] = "Hello";はできない。

でもwchar_tがintとなっている環境なら、int a[50] = L"Hello";でいけるはず。
率直にwchar_t使えと言うとこだが。
86デフォルトの名無しさん:2007/03/18(日) 15:49:35
>>84-85
なるほど。試してみたところ、

int a[50]={'H','e','l','l','o','\0'};  ○
char a[50]={'H','e','l','l','o','\0'};  ○
int a[50]="Hello";  ×
char a[50]="Hello";  ○

でした。
int a[50]={'H','e','l','l','o','\0'}; が>>80で言っていたint型の配列に
文字列を無理やり入れる方法にあたるんですかね?

また、>>80で>EOFの場合を弾いてからchar型として扱うべき
とありますが、どんな風にするんですか?
87デフォルトの名無しさん:2007/03/18(日) 15:57:21
文字列をintで扱うって言っても、ライブラリ関係を全部自作しないといけないよ。
88デフォルトの名無しさん:2007/03/18(日) 22:59:37
まあ試しに

int a[50]={'H','e','l','l','o','¥0'};
puts((char *)a);

をやってみるこった。思った通りの結果にならないから。
というわけで>>87になる。
89デフォルトの名無しさん:2007/03/19(月) 10:30:28
質問お願いします。
char a[100],b[100];
int i;

i = 0;
do { a[i] = b[i];
} while (a[i++] != '\0');

を、for文に書き換えたいのですが、
どうすれば良いでしょうか?
一応、
for ( i = 0; a[i] != '\0'; i++) {
a[i] = b[i];
}
としてみたのですが、うまくいきません。
90デフォルトの名無しさん:2007/03/19(月) 10:57:27
>>89です。
解決しました。
もう大丈夫です。失礼しました。
91デフォルトの名無しさん:2007/03/19(月) 13:38:13
課題でislowerを使わない(islowerのプログラムを自作する)というものが出たのですが、
どこから手を付けたら良いかさっぱり分かりません。
ヒントで良いので教えていただけませんか?
92デフォルトの名無しさん:2007/03/19(月) 13:43:09
1.文字がアルファベットの小文字かどうか判定する
2.小文字だったら大文字に変換する
93デフォルトの名無しさん:2007/03/19(月) 13:51:02
>>92さんありがとうございます。
ヒントを手がかりにしてやってみます。
94デフォルトの名無しさん:2007/03/19(月) 14:08:58
その素直なとこに免じてさらにヒントだ。
1.文字は数字で表され、aからzは順番に数字が割り当てられている。
2.大文字と小文字の差は一定。
95デフォルトの名無しさん:2007/03/19(月) 14:15:35
>>91です。
ありがとうございます。
ASCIIコードの大文字と小文字の差を利用すれば良いんですね。
だんだん分かってきました。
ありがとうございます。
96デフォルトの名無しさん:2007/03/19(月) 15:30:03
遅くなりましたが>>91です。
お陰でislower出来ました。
isupperのプログラムも真似してやってみたら出来ました。
>>92>>94さん、親切に教えてくれてありがとうございました。
97デフォルトの名無しさん:2007/03/19(月) 15:45:07
プログラミングの学習過程上では「そんなこともある」程度の認識でもOK
な雑談:

C言語はアスキーコードでない、アルファベットの並びが素直じゃない文字
セットで動くことを認めているので、アスキーを仮定するのは行儀が悪いと
言えば悪い。また、英語以外では大文字小文字の規則が少々複雑なこともあ
り、単純な引き算では片付けられないこともある。
98デフォルトの名無しさん:2007/03/20(火) 04:39:49
GetWindowTextで取得した文字列を他のプロセスにペーストするには
どうしたらいいでしょうか
99デフォルトの名無しさん:2007/03/20(火) 07:07:20
WM_SETTEXT メッセージを直接送ったら良かったと思う。
100デフォルトの名無しさん:2007/03/20(火) 10:16:50
WM_SETTEXTがまずいならWM_COPYDATAという手も。
それで間に合わないならプロセス間通信
101デフォルトの名無しさん:2007/03/20(火) 10:42:13
>>99
>>100
ありがとうございます。
自分、ズブズブの素人なもので、なかなか上手くいきませんが
調べまくって頑張りますです。
102デフォルトの名無しさん:2007/03/20(火) 17:03:48
例えば、data1に{2,4,22,5,3}とデータが初期化されていて、
data2にdata1のデータを小さい順に並び替えるにはどうすれば良いでしょうか?
sortはまだ習っていないので、数値を比較して、
小さかった順にdata2に代入していくという方法でやっていきたいのですが。
103デフォルトの名無しさん:2007/03/20(火) 17:08:14
自分が思う方法でやってごらん
カードとか用意して自分で手作業で並べかえてみてその方法をプログラムにしてみる
104デフォルトの名無しさん:2007/03/20(火) 17:11:54
一番小さいカードを選んで先頭に置いて、二番目に小さいカードを選んで二番目に置いて、以下同様に。
105デフォルトの名無しさん:2007/03/20(火) 17:22:52
>>103-104
ありがとうございます。
そのまま代入していく形になるんですね。
本当に初心者なものですみません。
106デフォルトの名無しさん:2007/03/20(火) 19:43:57
#include<stdio.h>

int main(void)
{
int date1[5]={2,4,22,5,3};
int i,j,k,date2[5];

for(i=0;i<4;i++){
for(j=i+1;j<5;j++){
if(date1[i]<date1[j])
{k=date1[j];
date1[j]=date1[i];
date1[i]=k;}
}
}

for(i=0;i<5;i++)
date2[i]=date1[i];

for(j=0;j<5;j++)
printf("%d\n",date2[j]);

return 0;
}

>>102をやってみた。
こっちも初心者なもんで、評価たのむ。
forばっかでウザいとは思う。
107デフォルトの名無しさん:2007/03/20(火) 20:06:20
>>102
>数値を比較して、小さかった順にdata2に代入していくという方法。
これも立派な既知のソートアルゴリズムだ。Selection sort。
108デフォルトの名無しさん:2007/03/20(火) 20:06:24
#include <"ファイル名">
このファイル名の部分についての質問です。

このファイル名は、大文字、小文字を区別してないみたいですが、
これって、仕様なんですか?

初歩的な質問ですが、よろしくお願いします。
109デフォルトの名無しさん:2007/03/20(火) 20:07:58
FATファイルシステム、MS-DOS、Windows(特にWindows NTのWin32サブシステム)などの仕様
110デフォルトの名無しさん:2007/03/20(火) 20:41:44
>>109
なるほど、仕様なんですね。
安心しました。

回答ありがとうございました。
111デフォルトの名無しさん:2007/03/20(火) 22:26:47
>>109
NTFSも区別しませんが何か。
112デフォルトの名無しさん:2007/03/20(火) 22:32:03
Macも、UNIXベースなくせにデフォルトインストールでは区別しないから
Macで動いてるRubyスクリプトを他所に持って行ってハマったことがある。
113デフォルトの名無しさん:2007/03/20(火) 22:52:45
>>111
NTFSは区別するよ。
Windowsの標準ファイルシステムドライバがFATとの互換性を維持するために、
大文字小文字の違いしかないファイルを同一視してるだけ。
SFUインストールすればオプションでCaseSensitiveな環境も構築できる。
114デフォルトの名無しさん:2007/03/21(水) 06:33:29
#include <stdio.h>

main() {
printf("Hello!");
return 0;
}
これで普通ならOKですよね?
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
sample1.c:
エラー E2209 sample1.c 1: インクルードファイル 'stdio.h' をオープンできない
警告 W8065 sample1.c 4: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main
)
*** 1 errors in Compile ***
って表示されて出力できないよorz
115デフォルトの名無しさん:2007/03/21(水) 08:24:08
>>114
コンパイラの環境設定に失敗しています。コンパイラの添付資料をよく読んで設定しなおしてみてください。
116デフォルトの名無しさん:2007/03/21(水) 09:23:52
エディットボックスに入力された文字列をOKボタンを押すと
クリップボードにコピーされるようにしたいのですが、上手く行きません。
VC++ Win32API スマートデバイス WM5.0SDKな環境です。

HWND hWnd;
HWND g_hEditbox;
TCHAR buff[256];

GetWindowText(g_hEditbox,buff,sizeof(buff)/sizeof(TCHAR));

if(OpenClipboard(hWnd))
{
 EmptyClipboard();

 char* buff;
 UINT size = strlen(buff)+1;

 HLOCAL clipbuffer = LocalAlloc(LPTR, size);
 strcpy((char*)clipbuffer, LPCSTR(buff));

 SetClipboardData(CF_TEXT,clipbuffer);
 CloseClipboard();
}

SetWindowText(g_hStatic,buff)でHWND g_hStaticにbuffの文字列は表示出来ています。
よろしければご教示願います。
117デフォルトの名無しさん:2007/03/21(水) 09:30:25
クリップボードにセットするデータはメモリへのハンドルでないといけないので、
固定メモリでは駄目、LMEM_MOVEABLEにしないといけない。
118デフォルトの名無しさん:2007/03/21(水) 09:46:33
HLOCAL clipbuffer = LocalAlloc(LMEM_MOVEABLE, size);

こうなるのでしょうか。
んんん、上手く行かない
119デフォルトの名無しさん:2007/03/21(水) 10:11:50
メモリへのハンドルに対しては直接読み書きできない。
LocalLockを呼んでハンドルからメモリへのポインタを取得する必要がある。
そしてアンロックすると再びハンドルが利用可能になる。
120116:2007/03/21(水) 10:17:17
SetClipboardData(CF_UNICODETEXT,clipbuffer);

とすることでなんらかのデータがクリップボードにセットされました
ペーストしてもなにも追加されませんが。
プログラミング初めて2日目なもんでまだ全然理解出来てないです。
勉強してきます。
121デフォルトの名無しさん:2007/03/21(水) 10:19:22
SetClipboardDataでググれば色々サンプルが見付かると思う。
122デフォルトの名無しさん:2007/03/21(水) 10:19:46
つかいい加減スレタイ嫁
123デフォルトの名無しさん:2007/03/21(水) 10:30:35
別に環境依存ネタ禁止ではないしいいんじゃないのそれくらい
124116:2007/03/21(水) 10:55:02
Unicode用と非Unicode用のが混在していたのが問題だったようです。
char*をwchar_t*, strcpyを_tcscpyなどに置き換えると
ちゃんとクリップボードにコピーでき、ペーストも出来ました。

スレ違い失礼いたしました。
レスくださった方ありがとうございます。
125デフォルトの名無しさん:2007/03/21(水) 13:19:59
#include <stdio.h>
int main(void) {
FILE *fp;
int i;
char ch[20];
fp = fopen("test1.txt","r");
if(fp == NULL) {
return 1;
}
printf("OPEN!!\n");
for(i = 0; i <1 ; i++){
fgets(&ch[i],20,fp);
}
printf("%s",ch) ;
fclose(fp);
return 0;
}
ファイルにabcdefgという文字列を書いておいてそれを読み取れたのですが、
for()のところの条件式をi<8としても、i<1としてもabcdefgと読み取れてしまう。
なぜ?
126デフォルトの名無しさん:2007/03/21(水) 13:23:35
>>125
fgets(&ch[i],20,fp);
はどういう動作をする?
127デフォルトの名無しさん:2007/03/21(水) 13:39:55
>>125
すいません。わからないです。
128デフォルトの名無しさん:2007/03/21(水) 13:48:10
1文字ずつ読むにはfgetcを使う。
どうしてもfgetsで1文字ずつ読みたいなら読んでもいいが、
書き方が間違っている。

fgetsは、最大で指定した数(20)-1の数の文字(バイト)を読む。
ただし、ファイルの最後か、改行にぶつかるか、エラーが発生するとそこまで。

20は、第1引数で確保した配列のサイズではなく、読み込みたい最大のサイズ+1。

-1したり+1したりするのは、読んだ後、末尾にfgetsが¥0を書き込むから。
129::2007/03/21(水) 17:29:07
卒論でC言語を使ってシミュレーションしたいと考えているんだけど。
気温のデータがあって、10年後の気温がどうなっていくか?って
いうシミュレーションをC言語でできる?そもそもこの課題じたいプログラミング
ではできない?まだ卒論まで2年あって、C言語習ったばっかなんだけど、
こういう事プログラミングでできないかな?って思ってます。シミュレーション
をするのに最適な言語って何ですか?
130デフォルトの名無しさん:2007/03/21(水) 17:33:43
シミュレートの計算・方法が分かるならば余裕で出来る。
131デフォルトの名無しさん:2007/03/21(水) 17:40:49
可能かどうかはアルゴリズムに因るわけだが
その辺の記述が全く無いので何もいえない

たとえば理想的な放物線をシミュレートするのは難しいができる事、
でも貴方の人生をシミュレートするのは出来ないこと(出来るかも?)

二つの違いはシミュレートするためのアルゴリズムの違いに因る
132デフォルトの名無しさん:2007/03/21(水) 17:53:38
>>129
気温シミュレーションは、別にC言語を使わずともできる。
133デフォルトの名無しさん:2007/03/21(水) 17:53:53
>>129
曲線を分析するならCで十分だろう。
気象シミュレーターみたいなものが作りたいなら、
Cでもできるが、そういう計算に最適化された言語もある。
134デフォルトの名無しさん:2007/03/21(水) 17:57:23
>>129
正直先生に聞いたほうが早いと思うぞ
135デフォルトの名無しさん:2007/03/21(水) 18:14:24
ウィンドウの長さとかテキストで簡単に編集できるようにしたいんですが
形式は何がいいんでしょうか?iniとかcfgとかdefとか
136デフォルトの名無しさん:2007/03/21(水) 18:16:34
好きなのでいいよ
137デフォルトの名無しさん:2007/03/21(水) 18:17:49
>>135
拡張子はなにがいいかって質問?
138デフォルトの名無しさん:2007/03/21(水) 18:17:53
設定ファイルの拡張子ってことか?
俺はユーザーに書き換えられても問題ないデータは.iniを使ってる。
139129:2007/03/21(水) 18:19:32
意見、ありがとう。
気温か待機電力のシミュレーションをしようか迷ってます。
まぁ卒論だからもっと練らないとだめだろうけどね!
待機電力量を出す計算の仕方はわかるから、それを何十年後は
どうなるか?っていうのはシミュレーションできる?実際は
将来、待機電力量を少なくする装置なんかも現在開発されてて
シミュレーションとは違う結果になるんだろうけど、その違いを
説明していくのも面白いと思ってます
140135:2007/03/21(水) 18:30:17
>>136-138
レスd。
>>138
そういう意味です。ありがとう。
141デフォルトの名無しさん:2007/03/21(水) 18:54:41
>>140
ふつうのユーザが弄れるようにするなら
デフォルトで関連付けられてるiniかtxtがいんでね?
142デフォルトの名無しさん:2007/03/21(水) 18:55:37
すまんWindowsならの話だなこれは
143デフォルトの名無しさん:2007/03/23(金) 17:03:55
if (wParam == VK_LEFT ){
MessageBox(NULL, "message", "title", 0);
}
if (wParam == VK_RIGHT ){
MessageBox(NULL, "message", "title", 0);
}

のように同じ動作をさせる場合、
if (wParam == VK_LEFT ? VK_RETURN){
MessageBox(NULL, "message", "title", 0);
}
みたいに一つにまとめるにはどうしたらいいですか?
144デフォルトの名無しさん:2007/03/23(金) 17:23:20
||
145143:2007/03/23(金) 17:26:14
>>144
ありがとうございます。

if (wParam == VK_LEFT || wParam == VK_RIGHT){
MessageBox(NULL, "message", "title", 0);
}

でいけました。
I でもいけたんですが、 I と II はどう違うんですか?
146デフォルトの名無しさん:2007/03/23(金) 17:27:17
| はビット演算の or
|| は論理演算の or
全然違う
147デフォルトの名無しさん:2007/03/23(金) 17:30:48
>>146
感謝です。スッキリしました。
148デフォルトの名無しさん:2007/03/23(金) 19:50:03
二度実行したら特定の動作をさせるってのはなんとなく出来そうなんですが、
三度実行したらまた別の動作をさせる、っていうのは可能でしょうか?
149デフォルトの名無しさん:2007/03/23(金) 20:13:11
よくわからんがカウンタを持って実行する度にインクリメント
150デフォルトの名無しさん:2007/03/23(金) 21:01:23
実行ってのが関数呼び出しのことなら関数内に static で呼び出し回数を
数える変数をおいとけばよろし。
151デフォルトの名無しさん:2007/03/23(金) 21:11:09
exe自体の実行回数で判別したいのです
いろいろ試行錯誤してますがどーもうまくいかず。。
152デフォルトの名無しさん:2007/03/23(金) 21:22:58
Windowsならレジストリに書くとか。

exeの実行回数となると、それなりの排他制御(同時に2つ起動したらどうなる?)
しなきゃならんのでご注意を。
153デフォルトの名無しさん:2007/03/23(金) 21:26:39
なるほど、単体で済まさずに外部で記録するなり制御させれば良さそうですね。
もうしばらく試行錯誤してみます。
154デフォルトの名無しさん:2007/03/23(金) 21:51:46
単純な処理を考えるのにフローチャートをよく使うんですが
Cプログラミング言語診断室では「goto文と並ぶ諸悪の根源」とかいわれて不安になりました
ノート1ページに収まるような小規模なものでもやっぱりやばいんですかねぇ?
155デフォルトの名無しさん:2007/03/23(金) 22:39:56
べつにヤバくはないけど、プログラミングは絶対に上達しないと思うよ。
156デフォルトの名無しさん:2007/03/23(金) 23:11:08
診断室なんか読まなくていい。今となっては古すぎる内容だし、
かといって書かれた当時は良かったのかというとそうでもない。
超初心者を叩く初心者が書いた本。

まあ、フローチャートはオススメしないけど。
157デフォルトの名無しさん:2007/03/23(金) 23:18:43
フローチャートって効率悪くね?
158154:2007/03/23(金) 23:23:25
診断室の信憑性とは関係なしに駄目ということですか
ならやっぱり図とか使わずにいきなりコードに書いて簡単なメモ取りながら試行錯誤する方がいいんでしょうか?
それとも無理やり頭の中で全部やっちゃう癖をつける方がいいんでしょうか?
159デフォルトの名無しさん:2007/03/23(金) 23:29:41
なれない内はメモにちょこっと書く分にはいいでしょ

やってるとわかるだろうけど、ちょっと処理が複雑になると
フローチャートなんて書いていられなくなる
160デフォルトの名無しさん:2007/03/23(金) 23:31:57
データフローお勧め
161デフォルトの名無しさん:2007/03/23(金) 23:32:44
ロジックよりも、きっちりとデータ構造を決める方がずっと重要だよ。
162154:2007/03/23(金) 23:51:29
データフローに関して調べてるうちにアクティビティ図というのを見つけました
メモがよく怪文書になるのでこういう定型的な書式を使ってまとめていく方針でいこうと思います
ありがとうございました

>>161
今まではそのデータ構造を決めるのに流れ図を使ってました
流れ図で書いてうまくかけない場合はその原因を踏まえて構造を見直す・・・といった具合にです
よく考えなくても滅茶苦茶効率悪いですがほかにいい方法を知らなくてです
163デフォルトの名無しさん:2007/03/24(土) 01:37:22
>>162
そこで擬似プログラミング言語ですよ。
164デフォルトの名無しさん:2007/03/24(土) 05:02:06
よし。ifとgotoしか制御構文のない擬似プログラミング言語でどんどん書くぜい。
165デフォルトの名無しさん:2007/03/24(土) 06:55:53
それも算術ifな
166デフォルトの名無しさん:2007/03/24(土) 13:56:14
また懐かしいものをw
167デフォルトの名無しさん:2007/03/26(月) 16:05:58
俺これからC言語始めようと思うんだが、「速習C言語入門」っていう本で大丈夫かな?
他のプログラムの知識はほぼ皆無で、これが最初ってことなんだけど。
168デフォルトの名無しさん:2007/03/26(月) 16:47:50
やりたい事が思いつかないなら課題と回答が沢山乗ってるやつ
やりたい事があるなら、
入門書なんかかわずにネット上で公開されてるC言語講座で十分です
169デフォルトの名無しさん:2007/03/26(月) 21:00:59
>>168 おk、やりたい事って特に無いからボリュームのあるやつ探すわ。
170デフォルトの名無しさん:2007/03/26(月) 21:18:25
ボリュームを求めるのは挫折者の典型例
171デフォルトの名無しさん:2007/03/26(月) 21:28:45
柴田本に汁
172デフォルトの名無しさん:2007/03/26(月) 21:38:43
Cだけなら大丈夫
いきなりwindowsプログラミング、さらにMFCとかじゃなければ
(VisualC++はこれで挫折者を大量生産した)
いきなりC++からやっても大丈夫だと思う

173デフォルトの名無しさん:2007/03/26(月) 21:53:29
柴田望洋の本なんか薦めるなよ
174デフォルトの名無しさん:2007/03/26(月) 23:17:01
>>170-173 いろんな意見あって結局どうするか迷ってきたw
時間は十分にあるんだがなぁ。
175デフォルトの名無しさん:2007/03/26(月) 23:22:30
入門レベルならネットで十分だと思うよ
176デフォルトの名無しさん:2007/03/27(火) 08:21:52
確かに何もわからないままVC買ってMFCアプリを選んで
出てきた自動生成コードを見て「なんじゃこりゃ?わけわかんね」と挫折する人いそうだ。
なまじ経済力がある大人ならなおさら。

177デフォルトの名無しさん:2007/03/27(火) 16:36:42
int main(int argc, char *argv[])
{
int i,j;
FILE *fp1;
char x[256]; /* 格納用配列 */
for(i=0; i <= argc; i++ ){
fp1=fopen("argv[i]", "r");
for(j=0; x[j]!=EOF; j++){
fgets(x, 256, fp1);
}
}
for(i=0; i<=argc; i++){
printf("%s\n", x[i]);
}


最近C言語を初めて、ファイル入出力の勉強をしています。
実行時にテキストファイル名を入力し、そのファイルの内容を表示させるプログラムを
作りたいのですが、セグメンテーション違反と言われます。
どこがおかしいのでしょうか・・?
178デフォルトの名無しさん:2007/03/27(火) 17:02:23
"argv[i]" はargv[i] の間違い?
あと、 argv[argc] はNULLになるからね。
i <= argc は i < argc で
179デフォルトの名無しさん:2007/03/27(火) 17:03:28
あとエラーにはならなかったと思うけど
argv[0] は実行したファイル名が入るからね。
180デフォルトの名無しさん:2007/03/27(火) 17:09:57
>>177
>178でも>179でもないけど更に言うなら、fgets()したものをそのまま捨てているので、
そのままでは最後のファイルの最後の行のみがファイル数分表示されることになってしまう。
ファイルもクローズしていないし、ファイル入出力の基本を復習しましょう。
181デフォルトの名無しさん:2007/03/27(火) 17:42:28
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{
if ( argc < 1 ){
printf("failed file open");
exit(1);
}
int i,j;
FILE *fp1;
char x[256]; /* 格納用配列 */
for(i=1; i < argc; i++ ){
fp1=fopen(argv[i], "r");
for(j=0; x[j]!=EOF; j++){
fgets(x, 256, fp1);
printf("%s\n", x[j]);
}
}
fclose(fp1);
exit(0);
}
ありがとうございます。参考にして手を加えてみました。
しかしまだセグメンテーション違反と言われます・・
>>178>>179
iの初期値を1からスタートさせるという意味でよかったでしょうか。
>>180
同じfor文の中にfgetsとprintfを入れてみましたが、
これでfgetsしたものを使えるようになったのでしょうか?
182デフォルトの名無しさん:2007/03/27(火) 17:57:04
まだつっこむとこいっぱいあるんだけど、
せめて、どの行で落ちたのかくらい自分でわかるようになってくれ
デバッガ使ってないんなら、せめて何行目までは動作したのか、
落ちたときの原因となる変数の中身は何なのか。
printf だけでもなんとかなるべ
183デフォルトの名無しさん:2007/03/27(火) 17:57:45
x[j] != EOF で何を判定したつもり?
184デフォルトの名無しさん:2007/03/27(火) 18:18:57
>>182
申し訳ありません。おっしゃる通りです。勉強してきます・・
>>183
ファイルの最後の行を判定したつもりです。
185デフォルトの名無しさん:2007/03/27(火) 18:27:38
>>184
1ファイルだけのプログラムもできないのに複数ファイルをいきなり扱おうとするのが大間違い。
そのロジックで本当に、ファイルの最後の行が判定できると思う? なんで? どこかに書いてあった? 思い込んでない?
186デフォルトの名無しさん:2007/03/27(火) 18:34:44
>>181
#include<stdio.h>
int main(int argc, char *argv[])
{
/* argcは通常1以上になるはずなので(argc < 1)は常に偽になる */
int i, j;
FILE *fp1;
char x[256]; /* 格納用配列 */
for (i = 1; i < argc; i++) {
fp1 = fopen(argv[i], "r"); /* iの値に応じてargv[0]..argv[argc-1]まで順番に開く */
while (fgets(x, 256, fp1) != NULL) printf("%s", x); /* エラーかEOFになるまで(fgetsがNULLを返さない間)xに読み込んでゆきその内容を表示する */
fclose(fp1); /* 次のファイルを開く前に今開いているものを閉じる */
}
return 0;
}
187デフォルトの名無しさん:2007/03/27(火) 18:36:13
本当はfopenとかを呼んだ時もエラーを返していないかチェックしないとあかんよ
188デフォルトの名無しさん:2007/03/27(火) 18:40:01
fp1 = fopen(argv[i], "r");
if (fp1 != NULL) {
while (fgets(x, 256, fp1) != NULL) printf("%s", x);
fclose(fp1);
} else {
printf("failed to open %s\n", argv[i]);
}
189デフォルトの名無しさん:2007/03/27(火) 21:01:24
ところで自分が書いたプログラムがどう動作するのか確かめるにはどうすればいいですか?
190デフォルトの名無しさん:2007/03/27(火) 21:05:17
コンパイルしてデバッガ使って走らせる
191デフォルトの名無しさん:2007/03/27(火) 22:18:05
>>190 即レス有難う。
次元の低い質問してすみませんでした。
192デフォルトの名無しさん:2007/03/28(水) 00:51:55
動作するかどうかの確認にはテストツールを使うんじゃないか?
テストに失敗したときにはデバッガが役に立つ。
193デフォルトの名無しさん:2007/03/28(水) 00:54:58
どのように動作するか、だった。
デバッガがある環境でその扱いに慣れてるならデバッガでステップ実行だね。
194デフォルトの名無しさん:2007/03/28(水) 17:22:26
なるほどSEHは必要だな、と思った。
195デフォルトの名無しさん:2007/03/29(木) 09:51:16
C99で追加されたインライン展開
これって実行速度が多少早くなる可能性がある、ってだけ?
196デフォルトの名無しさん:2007/03/29(木) 10:23:02
オーバーヘッドを気にして見難くするよりはインライン使ってすっきりさせろってことだろ
197デフォルトの名無しさん:2007/03/29(木) 10:35:47
#defineの関数形式のマクロよりは引数・戻り値に型がある分だけ
少しは型安全になっているという感じ。
198デフォルトの名無しさん:2007/03/29(木) 10:55:43
実はgcc/icc辺りだとstaticな関数は積極的にインライン展開するからinlineキーワードは使わない罠。
199デフォルトの名無しさん:2007/03/29(木) 14:45:59
cl.exeならどうか?
200デフォルトの名無しさん:2007/04/01(日) 09:27:48
イインダヨー
201デフォルトの名無しさん:2007/04/01(日) 16:50:00
フリーでC言語学習に使えそうなエディタとコンパイラ紹介してくれ。
202デフォルトの名無しさん:2007/04/01(日) 16:56:55
VisualC++ 2005
203デフォルトの名無しさん:2007/04/01(日) 18:32:03
それ以外でオネ
204デフォルトの名無しさん:2007/04/01(日) 18:35:10
VisualC++ 2005EE
205デフォルトの名無しさん:2007/04/01(日) 18:36:43
サービスパック1だから使用不可
それ系統以外でオネ
206デフォルトの名無しさん:2007/04/01(日) 18:37:53
BCC
207デフォルトの名無しさん:2007/04/01(日) 19:12:05
SP2を当てられない理由は?
208デフォルトの名無しさん:2007/04/01(日) 21:58:25
フリーじゃないから。
209デフォルトの名無しさん:2007/04/01(日) 22:04:43
はい?んなあほな
210デフォルトの名無しさん:2007/04/01(日) 22:51:52
割れXP使っててうpデートが出来ないんだろうが
211デフォルトの名無しさん:2007/04/02(月) 03:12:01
SP2はセキュリティ面で結構変更されたからSP1で動いてもSP2で動かないものもあるんよ。
MSがどんな変更を加えても追従できる筋のいいソフトばかりの世の中じゃないから。
そういうのは置き換えてはいってるがなかなか進まねえ。
212デフォルトの名無しさん:2007/04/02(月) 03:17:06
でも>>205はwarezを使ってる悪寒
213デフォルトの名無しさん:2007/04/02(月) 11:50:54
勉強目的ならcygwin+gccでいいじゃん
軽くうにっくすにも触れるし一石二鳥。
214デフォルトの名無しさん:2007/04/02(月) 13:47:56
癖がありすぎるから学習用にCygwinはお勧めできない。
あれはよくわかっているやつ向けだ。
coLinuxの方がいいよ。
215デフォルトの名無しさん:2007/04/02(月) 15:54:27
癖がありすぎるから学習用にcoLinuxはお勧めできない。
あれはよくわかっているやつ向けだ。
Debianの方がいいよ。
216デフォルトの名無しさん:2007/04/02(月) 16:31:15
癖がありすぎるから学習用にDebianはお勧めできない。
あれはよくわかっているやつ向けだ。
Vineの方がいいよ。
217デフォルトの名無しさん:2007/04/02(月) 17:35:46
癖がありすぎるから学習用にVineはお勧めできない。
あれはよくわかっているやつ向けだ。
Mac OS Xの方がいいよ。
218デフォルトの名無しさん:2007/04/02(月) 17:59:46
癖がありすぎるから学習用にMac OS Xはお勧めできない。
あれはよくわかっているやつ向けだ。
FedoraCoreの方がいいよ。

219デフォルトの名無しさん:2007/04/02(月) 18:28:20
なんでもいいからひとつに決めてくれよ…
220デフォルトの名無しさん:2007/04/02(月) 19:28:51
じゃあC言語
221デフォルトの名無しさん:2007/04/02(月) 22:27:46
MinGW gcc
Cygwinよりも癖があるような気がしないでもない。
222デフォルトの名無しさん:2007/04/03(火) 20:29:15
C言語の学習目的だけならMinGWいらないと思うんだが。
223デフォルトの名無しさん:2007/04/06(金) 09:33:29
紙とペンさえあれば学習は出来るわな
224デフォルトの名無しさん:2007/04/06(金) 10:33:15
実際に動く環境がないと、効率よくないだろ。
225デフォルトの名無しさん:2007/04/06(金) 20:01:54
やっぱvisual c++っしょ?
初心者でも使えるデバッガとか付いてるし
無料だしMS謹製だし
226デフォルトの名無しさん:2007/04/06(金) 20:49:45
BCCで十分
227デフォルトの名無しさん:2007/04/07(土) 07:22:10
初心者入門にVC++は罠過ぎるだろ
日本語でおkなヘルプに専門用語バリバリだから最初触ったとき意味不明だった記憶がある。
どっかのサイトみながらコマンドラインコンパイラいじってた方がよほど分かりやすかった。
228デフォルトの名無しさん:2007/04/07(土) 17:32:11
どのレベルの初心者かによる
229デフォルトの名無しさん:2007/04/08(日) 00:03:17
UML書きながら考える程度の初心者です
230デフォルトの名無しさん:2007/04/08(日) 14:05:02
せめて脳内でまとめてから図表にしようね
231デフォルトの名無しさん:2007/04/08(日) 22:11:41
まとめるための道具が図表だろうが。
それでまとまったら清書だろうが。
232デフォルトの名無しさん:2007/04/08(日) 23:27:29
図形の問題を考える時に適当な図とか描くけど
UMLもあぁいうような使い方出来んの?
233デフォルトの名無しさん:2007/04/08(日) 23:36:34
使う人次第としか
234デフォルトの名無しさん:2007/04/13(金) 21:14:28
リナックスの鯖借りてログインして使えば良いのでは?
235デフォルトの名無しさん:2007/04/21(土) 18:37:04
何の話かしらんが、借りるまでもなく自分で作ればいいだろ
236デフォルトの名無しさん:2007/04/22(日) 14:25:30
floatは必ずdoubleの半分なのでしょうか?
237デフォルトの名無しさん:2007/04/22(日) 15:10:03
いいえ。
238デフォルトの名無しさん:2007/04/22(日) 15:56:37
精度が倍であるのは確定ですよね?
239デフォルトの名無しさん:2007/04/22(日) 16:01:26
いいえ
float以上であれば十分
もちろんfloatにもdoubleにも最低限の精度の規定はあるが
240デフォルトの名無しさん:2007/04/22(日) 16:09:59
float ≦ double ≦ long double という規定だから、
float = double でも(両方とも最低精度をクリアしているなら)問題ない。
例えば、float = double で両方 64 ビットとか。
241デフォルトの名無しさん:2007/04/22(日) 23:01:28
>>238
厳密には精度は仮数部のbit長
IEEE754なら一意にきまるが, そうでなければ実装依存
IEEE754以前は機種依存, 互換性求めて古いフォーマットを使用可能にしている
処理系も結構ある.
242デフォルトの名無しさん:2007/04/23(月) 13:51:57
エクセス64もあるよね。
243デフォルトの名無しさん:2007/04/29(日) 18:43:03
mallocを失敗させたいのですがどうすればよいでしょうか?
244デフォルトの名無しさん:2007/04/29(日) 18:50:23
>>243
実行中にmallocによるメモリ操作時期において、なんかPCを粉々にする呪文を唱えて粉々にする
いやならOSのメモリ割り当ての部分を粉々にする
それも嫌ならメモリをガンガンmalloc()で予約しまくる
ってかラップする
245デフォルトの名無しさん:2007/04/29(日) 19:05:20
while(malloc(1));
246デフォルトの名無しさん:2007/04/29(日) 19:12:06
>>244
>>245
リモートの共有サーバでテストしているので大量のメモリ確保はできません。
ラップというはどうやるのでしょうか?
247デフォルトの名無しさん:2007/04/29(日) 19:19:14
static void *malloc(size_t size) { return 0; }
248裕美子(×いちのOL):2007/04/29(日) 19:57:08
今、Windowsプログラミング(Win32API)を勉強中です。
それで、疑問ですが、ウインドウプロシージャはコールバック関数である
ということで CALLBACKという識別子が関数名の前につくのですが、
どのC言語の入門本にもこの識別子の解説がありません。
この識別子はマイクとソフトが自社製OS用の開発言語に仕様として作った
ANSI−Cとは無関係のものでしょうか?
249デフォルトの名無しさん:2007/04/29(日) 20:11:37
…というか、<windows.h> の中で
#define CALLBACK __stdcall
としてあるだけ
250デフォルトの名無しさん:2007/04/29(日) 22:23:47
処理系定義なものだから、ANSI-Cは関係ないな。たしかに。
251デフォルトの名無しさん:2007/05/04(金) 01:55:35
ウィンドウズプログラミングって時点で処理系依存って理解できないのか。
他の処理系使う機会とか無いのだろうな。哀れだ。
252デフォルトの名無しさん:2007/05/04(金) 02:02:20
>>243
malloc(0x7FFFFFFF); を失敗するまで実行。
253デフォルトの名無しさん:2007/05/04(金) 05:36:50
>>252
メモリ管理もまともにできない糞OSであるLinuxなら失敗しててもずっと非NULL値を返すよ。
失敗している場合はそのメモリにアクセスした途端に強制終了させられるらしい。もう、アホかと。
254デフォルトの名無しさん:2007/05/04(金) 06:28:08
>>253
妄想乙。
簡単にできるんだから実験してから物を言おうねw
255デフォルトの名無しさん:2007/05/04(金) 09:40:32
256デフォルトの名無しさん:2007/05/04(金) 09:50:57
>突然あるプロセスが削除されるのが望ましくない状況で使用されていて、しかもカーネルのバージョンが十分に最近のものであれば、このメモリを割り当て過ぎる動作 (overcommitting behavior) を以下のコマンドで無効にできる。
257デフォルトの名無しさん:2007/05/04(金) 17:12:30
> malloc() が NULL でない値を返しても、そのメモリが実際に利用可能であることが保証されない。
失敗しても非NULLを返すとは書いてないな。
258デフォルトの名無しさん:2007/05/04(金) 17:58:06
>>257
犬厨必至杉w
259デフォルトの名無しさん:2007/05/04(金) 19:19:05
>Linuxなら(mallocが)失敗しててもずっと非NULL値を返すよ。
これは大嘘だぞ。
試しに

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *p;
while(p = malloc(0x7FFFFFF));
printf("malloc failed %p\n",p);
return 0;
}
これ実行してみ? もしお前のいうとおりならmalloc failedと出力されることはないよな。
260デフォルトの名無しさん:2007/05/04(金) 19:44:19
犬厨必至杉でワロタw
261デフォルトの名無しさん:2007/05/04(金) 19:47:41
怖すぎて実行する気になれない
262デフォルトの名無しさん:2007/05/04(金) 19:51:18
>>260
窓厨必死だなwwwワロス
>>261
別にちゃんときれいに死んでくれるから大丈夫だよ。もちろんmalloc failedと出力されて。
263デフォルトの名無しさん:2007/05/04(金) 19:56:46
>>262
顔、赤いよw
264デフォルトの名無しさん:2007/05/04(金) 20:02:27
殺さずにmallocに失敗させる方法ないかな?
窓なら例えば他のプロセスが使用しているメモリにアクセスするとかして
265デフォルトの名無しさん:2007/05/04(金) 20:05:25
>>262
環境依存ネタなのに、大丈夫だと言い張る馬鹿発見。
266デフォルトの名無しさん:2007/05/04(金) 20:11:20
>>264
いや、>>259の方法でも殺してはいない。ただmallocに失敗してるだけ。
「きれいに死んでくれる」の書きかたがまずかったな。
malloc失敗してNULLが返ってるだけだよー
malloc(0xffffffff)とかすれば失敗するでしょ。
窓でもmallocで別プロセスの使用しているメモリにアクセスすることは出来ないと思うよ。
窓だとVirtualAllocEx -> WriteProcessMemory とかでアクセスするんじゃなかった?
267デフォルトの名無しさん:2007/05/04(金) 20:11:28
268デフォルトの名無しさん:2007/05/04(金) 20:23:02
0xffffffffでできたー!!
Releaseじゃないとデバッガが勝手に殺してくれちゃって出来なかったけど
C++のbad_allocもおんなじようにすればいいのね
269デフォルトの名無しさん:2007/05/05(土) 00:43:36
bad_allocなら自分で投げろよw
270デフォルトの名無しさん:2007/05/05(土) 18:23:10
何でC言語出来るようになったのか教えて欲しい・・・
271デフォルトの名無しさん:2007/05/05(土) 18:24:40
目的の動作をするプログラムを書いたから、かな
272デフォルトの名無しさん:2007/05/05(土) 18:40:42
大量にコードを書いたからだな。
273デフォルトの名無しさん:2007/05/07(月) 23:18:25
kernelより先にメモリ確保すればいくらでも好きなだけ使えると思うが。
つ 仮想化
274デフォルトの名無しさん:2007/05/08(火) 02:58:23
なんか意味もなくvisualstudio2005買ってプログラム作ろうとしてるんだけど、
どのファイルを開けばいいんすか?
webとかwindowsインターフェースとかいろいろあってわからんですよ
275デフォルトの名無しさん:2007/05/08(火) 03:00:57
VSスレいけ
276デフォルトの名無しさん:2007/05/08(火) 04:38:09
そんくらいググれよ
277デフォルトの名無しさん:2007/05/09(水) 00:16:54
とあるソースをポーティングしててのことなんだけどさ、

int hogehoge(size_t length)
{
 if (length < 0 || length > sizeof (fooo)) {
  ;
 }
}

↑みたいなソースで、
「length < 0は、unsigned だから0以下で評価することはありえね〜」ってな感じの英文の警告がでるのだけど
無意味だから消す?
まんどくせ〜からシカト?
signed にキャスト?

おまんらならどうするよ?
278デフォルトの名無しさん:2007/05/09(水) 00:18:30
シカト
279デフォルトの名無しさん:2007/05/09(水) 00:18:50
↑対策案、もいっこあった。

コンパイルオプションで警告をOFFる
280デフォルトの名無しさん:2007/05/09(水) 00:20:04
その警告は実害ないから消しても別に良さそうだな。
281デフォルトの名無しさん:2007/05/09(水) 00:24:46
俺だったら、そこまでやる暇がない限りlength < 0を消す
282デフォルトの名無しさん:2007/05/09(水) 00:29:57
万が一を考えて消さない方がいいと思うけどな。
283デフォルトの名無しさん:2007/05/09(水) 00:35:51
>>282
万が一とは、コンパイラのバグのことか?(w
284デフォルトの名無しさん:2007/05/09(水) 00:36:08
警告はウザイのでsignedにキャストして消す。
後で他の重要な警告がくだらない警告でまぎれて見えずらくなるのが嫌なので。
285デフォルトの名無しさん:2007/05/09(水) 00:38:48
signed にキャストしたら絶対ダメだぞ!
それで負になるかもしれないわけだし。
286デフォルトの名無しさん:2007/05/09(水) 00:52:12
みなさん速レスサンクス
やぱ、十人十色っぽくなるかなぁ・・・・

もうね、最近C言語扱うってなったら、昔(10年ぐらい前)のソース(もちILP32)を
用件定義は、「昔と同じ機能で動けばいいよ」だけみたいな感じで、
いくら安いハードでも今時だから64bitだびょーんで動かすとなると・・・
迷うこと多いね・・・
ILP32互換オプションはデフォとしても(所詮昔の機能仕様程度だから2Goverのデータ扱うことないし)

>>284
他の重要な警告を見落とすリスクは脳裏をよぎった
>>285
真意。2G(ILP32と仮定して)超えるデータはありえね〜仕様だよなとか脳裏をよぎりつつ・・
>>281
暇(工数)考えると、よけいな修正してデグレてもあふぉらしいしなとか・・

まぁ、規模とか警告とかの件数によるので、値増し交渉のネタとか考えてみます。ありがとう
287デフォルトの名無しさん:2007/05/09(水) 00:56:34
警告ぐらいは何らかのフィルタかければいいだけだろう。
288デフォルトの名無しさん:2007/05/09(水) 01:03:55
>>286
そのコードを自分がどう扱わなければならないかで対応を変える。
自分がメンテナンスする羽目になるのなら、(問題がないか確認した上で)length < 0を消す。
管理は他人が行なうのなら、放置した上で「消えない(消さない)警告一覧」にリストアップしておく。
289デフォルトの名無しさん:2007/05/09(水) 01:33:01
呼び出すほうに hogehoge((size_t)-1) が無い事が確認できれば消すかな、おれなら。
でも、もしかしたら最上位ビットが立ってる場合、特別なナニカがあるのかもしれない・・・
290デフォルトの名無しさん:2007/05/09(水) 01:36:51
hogehoge の引数を、何らかの諸般の事情で size_t から int 等に変えるような状況が発生しえないのなら
length < 0 は消しても問題ないと思う。
291デフォルトの名無しさん:2007/05/09(水) 01:52:36
>>289
そのためのssize_tなのにcastして無視したら意味無いよね

constのパラメータをソッコーcastしたりとか・・意味ね〜

まぁ、腐臭のするソースなら、size_tもtime_tもssize_tも全部intだったりありがちだよね。
それでもbugらずに動いてたり(まぁ昔は大丈夫だったりするのかもしんないけど)

292デフォルトの名無しさん:2007/05/09(水) 02:52:35
おれならさっさと length<0を消して、
消した理由をコミットログに残してリポジトリにコミットだな。
293デフォルトの名無しさん:2007/05/09(水) 03:35:11
今のC言語の仕様に合ったソースに書き直す方向で、ってのは、ほぼ一致した意見ということで。
294デフォルトの名無しさん:2007/05/09(水) 03:45:22
以上、自演でした。
295デフォルトの名無しさん:2007/05/09(水) 03:52:16
一人だけ何を話していたか理解できなかった人がいたようでw
296デフォルトの名無しさん:2007/05/09(水) 07:48:26
質問です。

1から100までの数をプリントするプログラムを書け。
ただし3の倍数のときは数の代わりに「Fizz」と、
5の倍数のときは「Buzz」とプリントし、
3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

という問題に対し、

#include <stdio.h>
int main(void){
  char i;

  for(i=0;i<=100;i++){
    if(i%15==0){
      printf("fizzbuzz\n");
    }
    else if(i%5==0){
      printf("buzz\n");
    }
    else if(i%3==0){
      printf("fizz\n");
  }

  printf("%d\n",i);
}
return 0;
}

ならすぐ思いつくのですが、これでは答えを満たしていません。
どうすれば良いでしょうか?
297デフォルトの名無しさん:2007/05/09(水) 08:03:07
>>296
そこまで考えたのなら後一歩。
if () {
...;
} else if () {
...;
} else if () {
...;
} else {
...;
}
298デフォルトの名無しさん:2007/05/09(水) 08:13:05
あ、わかった。
continue;つかえば良いんだ。
トンです。
299デフォルトの名無しさん:2007/05/09(水) 08:20:16
>>298
continue;は最終手段。
300デフォルトの名無しさん:2007/05/09(水) 08:25:18
>>299
え〜。
元ネタは
http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm
なんですが、
この問題を再帰を使って2分以内で書くなんて無理だよ・・・
どうやれば再帰を使って書けるんですか?
301デフォルトの名無しさん:2007/05/09(水) 08:31:09
読んでみたが、「この問題に再帰を使え」なんて書いてないぞ。
16進も使わずに書けるだろ?
302デフォルトの名無しさん:2007/05/09(水) 08:31:23
>>295
それは君自身の事か?
303デフォルトの名無しさん:2007/05/09(水) 08:37:24
変態的な関数言語を除いては
ループで出来ることを再帰に直す問題より
再帰で簡単に出来るのを何とか可読性を保ちながらループに直す
って問題の方が遥かに多いと思うんですが、そうでもないんでしょうか?
304デフォルトの名無しさん:2007/05/09(水) 09:05:13
自前でスタック管理をすれば、再帰からループに直すのはすぐだな。
305デフォルトの名無しさん:2007/05/09(水) 09:55:09
>>296
乗り遅れ感バリバリだけど3と5は互いに素なんだから
else入れる必要ない、というより入れない方がいい。
306デフォルトの名無しさん:2007/05/09(水) 09:55:58
最後のは assert にしたらいいかな。
307デフォルトの名無しさん:2007/05/09(水) 19:47:31
なんでこんなに馬鹿がわいているんだろう……
308デフォルトの名無しさん:2007/05/11(金) 22:26:50
#include <stdio.h>
int main()
{
int end;
char name[10];

do {
printf("\n名前を入力してください。\n");
printf("名前:"); scanf("%s",name);

do {
printf("%sでよろしいですか? [y]es or [n]o :\n",name);
end=getchar();
} while (end!=121&&end!=110);

}while (end!=121);

return(0);
}

これの
"%sでよろしいですか?"
の部分が2回出てくるのですが、何がいけないのでしょうか。
見苦しいコードですが、よろしくお願いします。
309デフォルトの名無しさん:2007/05/11(金) 22:38:22
>>308
getchar()が喰い残した改行文字が入力されるため。
つーか、121だとか書かずに'y'と書きなさい。
310デフォルトの名無しさん:2007/05/11(金) 22:38:51
#include <stdio.h>
int main()
{
int end;
char name[10];
do {
printf("\n名前を入力してください。\n");
printf("名前:"); scanf("%s",name);
end=getchar();
do {
printf("%sでよろしいですか? [y]es or [n]o :\n",name);
end=getchar();
} while (end!=121 && end!=110);
} while (end!=121);
return(0);
}
311デフォルトの名無しさん:2007/05/11(金) 22:49:04
>>309-310
早速のレスありがとうございます。

>getchar()が喰い残した改行文字が入力されるため。
このあたり、まだ理解が足りないようなので勉強しなおしてみます。

>つーか、121だとか書かずに'y'と書きなさい。
なんとっ!
一冊の本だけをあてにするものではないですね。。
312デフォルトの名無しさん:2007/05/11(金) 22:52:00
その本の名前は?
313デフォルトの名無しさん:2007/05/11(金) 22:55:32
>>311
int ch;
while((ch = getchar()) != EOF) printf("%d[%c]\n", ch, ch);

これを実行してみれ。
314デフォルトの名無しさん:2007/05/11(金) 23:08:44
>>312
新版 明解C言語 入門編 (単行本)
http://www.amazon.co.jp/dp/4797327928
これです。
なにやら有名な本のような空気が…

>>313
ありがとうございます。
よくわかりませんが、とりあえずやってみます。
315デフォルトの名無しさん:2007/05/11(金) 23:53:03
>>314
標準入力がキーボードの時は
入力終了の改行も改行コード(\r)として入力に入っちゃうから
scanf()の入力終了の時に入った改行がscanf()自身で処理されず
次のgetchar()で拾ってしまう為に起こるバグ。
結構有名な落とし穴でscanf()が糞と言われるゆえんでもある。

ttp://www9.plala.or.jp/sgwr-t/c/sec05.html
ここの「scanfの注意事項(2)改行文字が残る」の項が分かり易いかも。
316デフォルトの名無しさん:2007/05/12(土) 03:10:02
>>314
さすがに end != 121は少々ヤヴァイね。ワロタwwwwww。
317デフォルトの名無しさん:2007/05/12(土) 04:04:04
また望洋か・・・
318デフォルトの名無しさん:2007/05/12(土) 08:07:21
>>315
だからそこのページはダメだって。
まぁ、
>入力終了の改行も改行コード(\r)として入力に入っちゃうから
こんな嘘書くくらいだからお似合いかも知れんが。
319デフォルトの名無しさん:2007/05/12(土) 08:12:03
>>315
そのページは、空白を含む文字列を読み込むにはscanf()の代わりにgets()を使えなんて書いているから論外だ。
320デフォルトの名無しさん:2007/05/12(土) 15:47:56
>>314
よくもまあそんな堂々とでたらめを書けるもんだな。
321デフォルトの名無しさん:2007/05/12(土) 15:56:24
え、嘘なのか?
俺も同じように習ったんだがどこが嘘なんだ?
322デフォルトの名無しさん:2007/05/12(土) 16:02:26
>>320
どこが出鱈目?
まぁ確かに明解C言語入門編が有名かといわれると些か疑問ではあるが。
323デフォルトの名無しさん:2007/05/12(土) 16:02:41
return(0); って括弧で括るやつがやたらたくさんいるのは
なぜかと不思議に思ってたんだが、こういうふうに書いてる本があるんだな。
324デフォルトの名無しさん:2007/05/12(土) 16:04:29
returnが関数だと誤解してる人を育成してる。
325デフォルトの名無しさん:2007/05/12(土) 16:05:19
>>322
ん?本の内容がでたらめだって話じゃねえの?
326デフォルトの名無しさん:2007/05/12(土) 16:07:35
初心者向けに端折ったりするとああなる。
後で他の本を読んで誤解が解ける事を見越して書いてるんだろう。
327デフォルトの名無しさん:2007/05/12(土) 16:13:06
なんだ、本の内容か。それなら著者を見た時点で出鱈目なのは自明じゃないか。
328デフォルトの名無しさん:2007/05/12(土) 16:54:28
int i(0)も駄目でしょうか?
329デフォルトの名無しさん:2007/05/12(土) 16:56:50
ここはCのスレです。
330デフォルトの名無しさん:2007/05/12(土) 16:58:42
>>328
駄目
331デフォルトの名無しさん:2007/05/12(土) 20:36:57
C言語初心者です。
javaは少しやったことあります。
最初にコンパイラとか環境作りをすると思うのですが、
その場合は、雑誌など買って付いてくるROMを使うのでしょうか?
初歩的な質問ですいません(;´Д`)
332デフォルトの名無しさん:2007/05/12(土) 20:38:19
つVC2005Express
333デフォルトの名無しさん:2007/05/12(土) 20:56:17
雑誌についてくるような物はネットでも公開してることが多いから
最近は検索してダウンロードが多いね。

自分も332と同じくVisualC++ 2005 Express Editionがお勧め。
334デフォルトの名無しさん:2007/05/12(土) 23:23:23
>>323
昔は本当にreturnにも括弧が必要だったという事情もある
今でもやたらたくさん要ることの説明にはならないかもしれないが
335デフォルトの名無しさん:2007/05/12(土) 23:33:57
K&R一版には括弧付いてたっけ
336デフォルトの名無しさん:2007/05/12(土) 23:40:01
>>334
> 昔は本当にreturnにも括弧が必要だった
それって都市伝説じゃないのか?
337デフォルトの名無しさん:2007/05/13(日) 00:22:56
>>335
付いてた

Cが開発中の時は、 returnが関数だったのかも知れないって
説もあったけど真相は不明。
338デフォルトの名無しさん:2007/05/13(日) 00:27:54
情報を拾おうにも、どう検索していいものやらだな・・・。
339デフォルトの名無しさん:2007/05/13(日) 00:53:56
>>337
呼び出し元の関数でスタックをどれだけ使ったかわからないのに、
呼び出し先で戻り先がわかるものなのかな。
340デフォルトの名無しさん:2007/05/13(日) 01:18:10
>>339
Pascalチックな作りだったんじゃね?
341デフォルトの名無しさん:2007/05/13(日) 01:45:56
ライオンズ本を見てみたが、return (式); という書き方を使っているな。
342デフォルトの名無しさん:2007/05/13(日) 01:58:15
>>340
Pascalちっくというと積んだパラメータをスタックから取り除くのは、
呼び出し側の責任てだけだよね。

それ以外にもauto変数もスタックを使うわけだし、
やっぱりreturnが関数だったとして戻るところがわかるとは思えないな。
どうやっていたんだろう。というか都市伝説の一種だろうね。
343デフォルトの名無しさん:2007/05/13(日) 12:15:21
本当に関数だったのではなく、構文上関数の形式を取っていただけなのかもしれん。
コンパイラが特別に配慮するとかして対処。
まあ、そうすることの意義とか利点が分からんので多分違うと思うけど。
344デフォルトの名無しさん:2007/05/13(日) 12:17:24
switchとかと同じなんじゃないの?
345デフォルトの名無しさん:2007/05/13(日) 17:22:28
無料のコンパイラをダウンロードし、入門書を見ながらやっているのですが、

#include <stdio.h>
main () {
printf("C programming");
printf("日本語もOK?");
return 0;
}
これをファイルに保存し実行したら、メモ帳が開き↑のが出てきてました。
何が悪いのですか?
346デフォルトの名無しさん:2007/05/13(日) 17:31:24
>>345
頭。
ファイルをダブルクリックでアプリケーションを探してもらうのではなく、
アプリケーションからファイルを開くことも覚えておいた方がいい。
347デフォルトの名無しさん:2007/05/13(日) 17:36:10
コマンドラインでソースコードのファイル名を指定したのかも?
348デフォルトの名無しさん:2007/05/13(日) 17:47:26
>>345
そもそもPCの知識なしにプログラムなんてできるわけがないよ
349デフォルトの名無しさん:2007/05/13(日) 18:13:19
入門書にコンパイルの方法って載ってないの?
350デフォルトの名無しさん:2007/05/13(日) 18:14:16
コマンドラインで
test.c
ってな感じにやったのなら根本的に間違い。
.cのソースファイルをコンパイラでコンパイルし、
出来たexeファイルとかを実行する
351デフォルトの名無しさん:2007/05/13(日) 18:14:46
>>345
C 入門の入門読んでるでしょ。全項目飛ばさずに読みなよ。
352デフォルトの名無しさん:2007/05/13(日) 18:38:56
もしかしたら「C言語エディタの使い方〜入門編〜」とかだったりしてなw
353デフォルトの名無しさん:2007/05/13(日) 20:44:32
BCC Developer使ってるんですけど、一つのプロジェクトには一つのexeしか作れないんですか?

例えば、testというプロジェクトにtest01.cとtest02.cを入れて、メイク→実行とやっても、先に作ったtest01.cの結果しか表示されません。
354デフォルトの名無しさん:2007/05/13(日) 20:57:23
たぶん1プロジェクトに1exeファイル。
bcc32 test01.c test02.c
みたいになってると思う
355デフォルトの名無しさん:2007/05/13(日) 21:03:52
>>354
わかりました。ありがとうございました。
356デフォルトの名無しさん:2007/05/13(日) 23:15:31
他の関数で配列をmallocでメモリ確保して、
mainでfreeした場合、配列はきちんと開放されるんでしょうか。
配列は引数で渡すと要素数が記憶されなかったと思うのですが
この場合きちんと開放されるのかがわからないです。

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
  char *str;
} TEST;

TEST* get_test(void)
{
  TEST *t = (TEST *) malloc(sizeof(TEST) * 10);
  t[9].str = "Hello, World!";
  printf("t in test() : %p\n", t);
  printf("%p : %s\n", t[9].str, t[9].str);
  return t;
}

int main(void)
{
  TEST *t = get_test();
  printf("t in main() : %p\n", t);
  printf("%p : %s\n", t[9].str, t[9].str);
  free(t);
  return 0;
}
357デフォルトの名無しさん:2007/05/13(日) 23:50:17
やたらと「配列」という単語が出てきてる日本語の質問だけど、
プログラムソース読むとTEST型の大きさのメモリ領域の確保と解放してるだけなんだが?
358デフォルトの名無しさん:2007/05/13(日) 23:57:16
>>356
されるよ
359デフォルトの名無しさん:2007/05/13(日) 23:57:57
mallocは実行時に確保した領域のポインタとサイズを"どこかに記録"してある。
freeをする時は引数とその記録から解放する領域の範囲がわかる。
360デフォルトの名無しさん:2007/05/13(日) 23:59:05
> TEST *t = (TEST *) malloc(sizeof(TEST) * 10);
ここで配列使ってるぉ (^ω^
361デフォルトの名無しさん:2007/05/13(日) 23:59:54
配列ではない
362デフォルトの名無しさん:2007/05/14(月) 00:02:55
配列じゃないよね
363デフォルトの名無しさん:2007/05/14(月) 00:10:44
(^ω^ どこがちがうのかぉ?
364356:2007/05/14(月) 00:20:42
mallocは配列でなくて、callocを使えば配列になるんでしょうか。
下のfreeはmallocでもcallocでも確保したものは全部解放してくれる
と考えていいんですね。ありがとうございます。
365デフォルトの名無しさん:2007/05/14(月) 00:29:42
calloc使っても配列にはならない。
ポインタと配列は区別しときなさいな。
http://homepage3.nifty.com/mmgames/c_guide/15-07.html
366356:2007/05/14(月) 00:43:05
なるほどありがとうございます。
・配列というのはローカル変数でしか扱えない
・引数、戻り値は全部ポインタ変数
という考えでいいですか。
367デフォルトの名無しさん:2007/05/14(月) 00:43:12
>365
そのページは痛いな
368デフォルトの名無しさん:2007/05/14(月) 00:44:38
んじゃもっとましのを貼っといて。
369デフォルトの名無しさん:2007/05/14(月) 00:59:00
>>366
どこにもそんな事は書いてないだろ・・・
370デフォルトの名無しさん:2007/05/14(月) 01:25:39
371デフォルトの名無しさん:2007/05/14(月) 02:03:52
>365
バブルソートのソース面白すぎ。
372デフォルトの名無しさん:2007/05/14(月) 02:14:51
どこが面白い?
普通じゃん。
373デフォルトの名無しさん:2007/05/14(月) 02:25:57
マジでやばいw
374デフォルトの名無しさん:2007/05/14(月) 03:30:04
>>365
たとえば
>[]の役割は、配列の要素番号を指定する演算子なのですが
>その仕組みは、単に、配列名というアドレスに足し算を行っているだけです。
配列とポインタの違いについて解説しているのに、これはないだろう。
添字演算子は配列にもポインタにも使えるって事なのに。
375デフォルトの名無しさん:2007/05/14(月) 03:38:05
バブルソートは普通、内側のループは1回づつ減っていくだろ。
376デフォルトの名無しさん:2007/05/14(月) 03:48:37
>>374
int a[5] = { 0, 1, 2, 3, 4 };
printf("%d\n", *(a + 3));
377デフォルトの名無しさん:2007/05/14(月) 04:10:44
>>376
なにがいいたい?
その[]は演算子ではないし、p[n]と*(p+n)が交換可能なのは、配列とポインタの違いとは関係ない。
378デフォルトの名無しさん:2007/05/14(月) 04:42:03
そもそも「配列とポインタの違い」を解説するなんて
どこにも書いてない訳だが。
379デフォルトの名無しさん:2007/05/14(月) 04:55:35
>>365 はなぜこれを引用したのか
380デフォルトの名無しさん:2007/05/14(月) 06:49:30
「配列とポインタの奇妙な関係」が配列とポインタの違いを解説していなかったら、いったいなにを解説するんだろう?
381デフォルトの名無しさん:2007/05/14(月) 07:14:05
配列とポインタの類似点とか
382デフォルトの名無しさん:2007/05/14(月) 07:16:09
そもそも実行時には配列なんて概念が無くなるとか
なくなっちゃって困る場面があるから構造体にまとめてプチリフレクションにしてるとか
383デフォルトの名無しさん:2007/05/14(月) 07:52:03
http://itpro.nikkeibp.co.jp/article/COLUMN/20070411/268003/
なのですが、
unsigned char *mapstr = {
"*********"
"*.......*"
"*.**o**.*"
"*[email protected].*"
"**o%%%*.*"
"**....*.*"
"****..***"
"*********"
};
を「盤面の初期状態をmapstrという文字列として定義しています。」
とありますが、これって文字列なのでしょうか?
384デフォルトの名無しさん:2007/05/14(月) 07:54:31
文字列です
385デフォルトの名無しさん:2007/05/14(月) 08:10:00
文字列へのポインタの配列です。
386デフォルトの名無しさん:2007/05/14(月) 08:10:02
なんで { } で囲んでるのかは理解できないけど文字列。
387デフォルトの名無しさん:2007/05/14(月) 09:01:09
解りやすいように書いてあるだけで、実は1つの文字列です。
388デフォルトの名無しさん:2007/05/14(月) 09:17:39
>>385
こいつ馬鹿ww
389デフォルトの名無しさん:2007/05/14(月) 10:27:00
gccで、sleep(time)にすると秒単位しか指定できないようなのですが、
ミリセカンド単位(0.5秒とか)でスリープさせるにはどうしたらよいのでしょうか。

教えてエロイひと
390デフォルトの名無しさん:2007/05/14(月) 10:31:11
man したら usleep とか nanosleep とかでてきたけど
391デフォルトの名無しさん:2007/05/14(月) 10:38:51
>>389
環境依存。sleep()は一般的に、秒単位で寝る関数。
sleep()が使える環境なら、大抵はUnix系だろうからusleep()かnanosleep()が使えるはず。
但し、精度に関してはミリ秒以下しかないので要注意。
cygwinなど、Win環境でgccを使っているのなら、APIのSleep()を使うのも一つの選択。
392389:2007/05/14(月) 10:45:21
>>390 >>391
うぁぁサンクスです。ありがとうありがとう。
393デフォルトの名無しさん:2007/05/14(月) 15:58:29
#include<windows.h>
〜〜〜
で、コンパイルしたら、「インクルード ファイルを開けません。'windows.h'」

って出ました。これって、どこで手に入れるものなんですか?無料でDL出来るんですか??教えてくださいm(__)m
394デフォルトの名無しさん:2007/05/14(月) 15:59:43
Express Edition かな。
PlatformSDK ってのがフリーで落とせる。
詳細はググれ。
395デフォルトの名無しさん:2007/05/14(月) 16:40:15
>>393
includeやlibのPATHが設定されてないとか
396デフォルトの名無しさん:2007/05/14(月) 16:52:25
>>393
PlatformSDKを落として
libのパスを通すための詳細を誰かがどっかのページに
載っけてるからググれ
397デフォルトの名無しさん:2007/05/14(月) 21:11:26
Visual Studio 2005ならWindows SDKのほうが便利。
スタートメニューにそこらへんの設定を自動で行ってくれるツールへのショートカットが入っている。
398デフォルトの名無しさん:2007/05/14(月) 21:44:44
連結リストを逆順につなぐreverse関数を作成したいのですが、
アルゴリズムが分かりません。どなたか教えていただけませんか?
399デフォルトの名無しさん:2007/05/14(月) 21:46:51
>>398
>連結リストを逆順につなぐreverse関数を作成したいのですが、 
>アルゴリズムが分かりません。どなたか教えていただけませんか?

double linked list を使え。
400デフォルトの名無しさん:2007/05/14(月) 21:53:10
>399
双方向リストは使用しないで、やりたいです。
単方向だけでやる方法を教えてください。
401デフォルトの名無しさん:2007/05/14(月) 21:55:49
スタックを用意すれば?
402デフォルトの名無しさん:2007/05/14(月) 21:58:55
絵を描いて考えればわかると思うよ
4個の要素がある場合
根--->1-->2-->3-->4

wk-->2-->3-->4    根-->1
wk-->3-->4    根-->2-->1
wk-->4    根-->3-->2-->1
wk    根-->4-->3-->2-->1
403デフォルトの名無しさん:2007/05/14(月) 23:26:10
>402
絵を描いてみたのですが、どうしても分かりません。
使用する構造体のポインタは根とwkだけでできますか?
404デフォルトの名無しさん:2007/05/14(月) 23:30:57
比較的最近、この板のどっかで初心者がそういう関数のソースの解説を求めてたから、
真面目に解説した記憶があるよ。探してご覧。
405デフォルトの名無しさん:2007/05/14(月) 23:34:38
今、自分のノートPCにFreeBSDをインストールしてCプログラムをコンパイル&実行したりしています。
それで友達がVisual Studioのほうがいいよと言います。
大学のPCにはVisual Studioが入っているのですが重くてどうも好きになれません。
その点、FreeBSD(UNIX系)のほうが軽いしコンパイル作業等、本当にプログラミングしてる感じが好きです。
将来はプログラマーを目指しているのですがVisual Studioのほうがいいのでしょうか?
406デフォルトの名無しさん:2007/05/14(月) 23:37:26
1.全部の要素をwkに移す。
根-->null
wk-->1-->2-->3-->4-->null

2.wkの先頭の要素を、根とその次の要素の間に挿入。
根-->1-->null
wk-->2-->3-->4-->null

3.2を繰り返す。
根-->2-->1-->null
wk-->3-->4-->null

根-->3-->2-->1-->null
wk-->4-->null

根-->4-->3-->2-->1-->null
wk-->null
407デフォルトの名無しさん:2007/05/14(月) 23:38:38
>>405
好きなほうでいいよ
どっちもやってみればいいじゃない
408デフォルトの名無しさん:2007/05/14(月) 23:41:28
>>405
仕事になれば決められた開発環境をつかわなならんこともあるだろう。
そのときに適応できればなんでもいいよ。
409デフォルトの名無しさん:2007/05/14(月) 23:42:45
>>405
今、FreeBSDでのプログラミングが楽しいんならそれでいいんでない?
コマンドラインツールに慣れてれば、後々いろいろと応用が利くしね
統合環境から入るとコマンドラインツールに触れる機会あんまりないだろうし
410デフォルトの名無しさん:2007/05/14(月) 23:50:49
>406
ありがとうございました!できました。
411デフォルトの名無しさん:2007/05/15(火) 01:09:43
>>405
両方ともやって損はないと思うよ。
412デフォルトの名無しさん :2007/05/15(火) 03:15:34
ああ、俺いつまでたっても、リストが苦手だ・・・
よっし!いいかげんリストは丸暗記してしまうくらいソースを書いて練習しまくろ。
いつまでたっても中途半端な自分に嫌気がさしてきた。
C#どころじゃねーよ。
プログラミングの勉強初めて3年足らずでC→JAVA→C++→C#
なにやってんだ俺!ばかじゃねえの。中途半端もくそ食らえじゃねーか。
がんばれよ俺!
413デフォルトの名無しさん:2007/05/15(火) 03:34:42
ソースを丸暗記って、理解したことになんないよ。
そんな人が書くプログラムは怖くて信用できない。

図を書いて理解するといいよ。
414412:2007/05/15(火) 05:11:05
いや、丸暗記しちまうくらい、ソースを書いて鍛錬するって意味っす。
さすがにどんなソースでも丸暗記したところで、理解にはつながらないのは
当然なので、よく咀嚼しつつソースを書いて鍛錬しようと思っています。
415デフォルトの名無しさん:2007/05/15(火) 07:26:16
イディオムとして一瞬で出てくるぐらい使い慣れるって事じゃないの?
長年やってる人とか考える前にコードが浮かんでくるらしいし
416デフォルトの名無しさん:2007/05/15(火) 07:45:44
>>412
似たような文法ばかりだから、一つやると理屈でなく体で覚えてしまう。
だから身につかない。
pascal系のように少し毛色の違う言語に
移植しながら勉強すると身に付き易いよ
417デフォルトの名無しさん:2007/05/15(火) 07:58:33
それだけ苦労しても、C++なら全く必要ないって辺りが難だがな。
418デフォルトの名無しさん:2007/05/15(火) 08:00:43
Cやるのにpascal??C++とJavaを並行するならまだしも
あと最初っから体で覚えれるような超天才はまずいないから余計な心配だと思うが…
419416:2007/05/15(火) 08:15:07
>>418
リスト構造だとCならポインタで書いてると思うが
C++はポインタを書く上でCと同じ、JAVAは・・・・

pascaのポインタは *p が p^ になる。 前と後ろの違いだが
違うことで、共通の概念が身に付けられる人もいるって事さ。
420デフォルトの名無しさん:2007/05/15(火) 08:37:40
C++ なら list 使えばいいだけだしなあ。
でも、理屈が分かってないと使用時のコストの見積もりもできないから
理解しなくてもいいというわけではないけどさ。
421デフォルトの名無しさん:2007/05/15(火) 08:40:58
>416
LispとかHaskellとかPrologとかやると
Pascal系が「毛色が違う」なんて思えなくなるよ。
CもPascalも「え?ほとんど一緒じゃん」に変わる。
422デフォルトの名無しさん:2007/05/15(火) 08:41:25
せめてメンバ関数とコンストラクタデストラクタは使わせてください…
それらすらないCでの実装は結構面倒くさいです
あと出来ればテンプレート構文も
423416:2007/05/15(火) 08:41:44
C++のlistはたしか双方向では?
424416:2007/05/15(火) 08:48:56
>>421
毛色が違う程度に違う複数言語で同じ事をやると、扱ってる概念が身に付き易いのであって、
そこまで言語にリスト構造取り込んでると、「毛色が違う」レベルじゃなくて種が違うというレベルだろと思うが?

リスト構造ではなく、もっと高位概念なら「毛色が違う」レベルも広がるとは思うのだが
425デフォルトの名無しさん:2007/05/15(火) 08:49:27
そもそもCを勉強したいのにPascalとか横道それるのがよく分からん
他の言語でも使える共通概念覚えるなんて一通り使えるようになってからでもいいじゃんか
C→C++、C#って行くのが目的だからCは最低限で切り上げるってんなら分かるけどさ
426416:2007/05/15(火) 08:55:47
違うって。 身に付けたいのはC言語でのリスト構造の扱いなんだろ?
そいつを身に付けたいなら、他の言語にCのコードを移植したり、逆をやったりした方が早道だって言ってるのさ
427デフォルトの名無しさん:2007/05/15(火) 09:02:06
最初からマルチバイリンガルな人だったら確かに早いかもしれない
しかし、態々新たに他の言語の勉強するんだったらかなり遠回りになると思うんだけど
428デフォルトの名無しさん:2007/05/15(火) 09:06:37
急がば回れって言うじゃなーい?
429デフォルトの名無しさん:2007/05/15(火) 09:15:46
データ構造の勉強ってそんな面倒くさい事しないと駄目なんか
流石に教科書と睨めっこするだけよりは確実に手っ取り早いだろうけど
あと他の言語覚えるのも兼ねてればやる気出るかもしれんな、
ただそれでC#やJavaなんて覚えた日にゃ一生Cに戻ってこなくなるかもなw
430デフォルトの名無しさん:2007/05/15(火) 09:20:26
他言語に手を出すより、自分にとって意味のあるデータで数をこなすほうがいいと思うけど。
431デフォルトの名無しさん:2007/05/15(火) 09:21:05
言語そのものを覚えるのと、アルゴリズムの理解は、そりゃまあ別だろうな
C#やJAVAだと、アルゴリズムの理解じゃなくてアルゴリズムを実装したライブラリの使い方の話になってしまうように思う
432デフォルトの名無しさん:2007/05/15(火) 09:27:06
まあ、色んな言語に手を出せば、
色んな視点が養われていいと思うけどね。
ある言語では当たり前のことが、
別の言語では当たり前じゃない、
ってのを経験するのは悪くない。
433デフォルトの名無しさん:2007/05/15(火) 09:27:29
まあPASCALならC言語以上に簡単だから、遠回りって程じゃないように思うけどな
人によって違うのかもしれないが。
434デフォルトの名無しさん:2007/05/15(火) 09:32:43
パスカルってポインタ扱えるんだ・・・知らなかったよ
435デフォルトの名無しさん:2007/05/15(火) 09:40:21
char str[50];
という配列に、fgetsを使って標準入力で「abc/def/ghi/jkn」という文字列を格納して
次にそれをprintfで表示しました
その後またfgetsで標準入力から例えば「Hello」という文字列を格納して
printfで表示しようとすると、最初に入力した文字列が残っているのか、
変な文字列が表示されてしまいます
これはどうすればいいんでしょうか
436デフォルトの名無しさん:2007/05/15(火) 09:41:46
今は組み込みでさえC++使える時代なんで、そもそもC言語にこだわる必要が無いだろう
データ構造まできたらC++でとっととジェネリックプログラミングの方向に行ったほうがいいと思う
車輪の再発明的なアルゴリズム、データ構造の実装に関してはCより遥かに楽にできるし
437デフォルトの名無しさん:2007/05/15(火) 09:46:32
>>435
その部分のコードを書いてみて、

>>436
組み込みではC++は使えてもSTL解禁とまではいかないよ
それにテンプレートで単純リスト扱うのって俺様テンプレートって事だろうけど、これは一番嫌われる。
438デフォルトの名無しさん:2007/05/15(火) 09:46:52
スレ違い
439デフォルトの名無しさん:2007/05/15(火) 09:47:32
>>435
fgets()は最後に\0を付けるので、最初に入れた文字列が残るってこと
はないはずです。あなたのコードを示してみましょう。

440デフォルトの名無しさん:2007/05/15(火) 09:56:44
http://hp.vector.co.jp/authors/VA014436/prg_memo/ccpp/c_d.html
これ見てもう判ったつもりになれた俺は やったつもりでいい?
441デフォルトの名無しさん:2007/05/15(火) 10:12:55
>>440
その表、なんかところどころおかしいなw
リストの勉強したいなら、「データ構造+アルゴリズム」とかの本で勉強すると良いよ
ヴィルト先生の教科書とか

>>436
組み込みの現場はまだCのところが多いぞ、C++使ってるところもあるけど
Cしか知らんやつらがどんなコード書いてるのか、想像すると怖いw
442デフォルトの名無しさん:2007/05/15(火) 10:56:42
>>441
未だにレガシースタイルで関数を書こうとしたり、変数の使い回しに手間隙掛けたり想像を絶するよ。
443デフォルトの名無しさん:2007/05/15(火) 10:59:50
void foo(a, b)
  int a, b;
{
  ほげほげ
}

とか、FORTRAN のプログラム読んでるみたいだよ・・・。
444デフォルトの名無しさん:2007/05/15(火) 11:11:44
ある文字列1が、ある文字列2と一致しているかどうかをチェック方法にはどのようなものがあるのでしょうか?
445デフォルトの名無しさん:2007/05/15(火) 11:12:40
strcmp(str1, str2) == 0
446デフォルトの名無しさん:2007/05/15(火) 12:35:18
>434
Delphiだと、文字列型や配列型が組み込みだからポインタ使わないし
オブジェクト型の変数もデフォで参照なんで普段はポインタを使う場面が少ないけどな。
少し突っ込んだ使い方する場合は使うかも。(CのDLL使う時は当然必須だし)

あれは最初に「何型へのポインタ」って型を定義するところが特徴的。
例えば整数型へのポインタには整数を指すアドレスしか代入できず
値を戻すのも整数型の変数にしかできないはず。(キャストした場合は別だけど)
447デフォルトの名無しさん:2007/05/15(火) 12:44:12
基本的にはそうなんだけど、抜け道としてabsolute という強力な指令があるので、
いちいちキャストも必要ない
var
  pc:^char;
  pb:^byte absolute pc;
  pw:^word absolute pc;
とやれば常に pc=pb=pw になるわけ
448デフォルトの名無しさん:2007/05/15(火) 13:42:37
それは共用体みたいに
メモリを共有する感じ?
449デフォルトの名無しさん:2007/05/15(火) 13:43:43
Del厨巣に帰れ
450デフォルトの名無しさん:2007/05/15(火) 14:36:19
>>448
union というより
#define pw ((word *) pb )
のように、別名を与えるような感じ。

union相当は record型でcase文を使う事になる
451デフォルトの名無しさん:2007/05/15(火) 17:33:01
クロストレーニング
 特定の競技のみを行なっていると、どうしても身体の一部に負担がかかり、故障の原因となります。
 クロストレーニングをすることにより予防することもできますし、
 いつもと違う動作は、あらゆる筋肉を使ったり柔軟性を高めたりすることも可能ですし、
 何より精神的にリフレッシュできます。
452デフォルトの名無しさん:2007/05/15(火) 22:57:21
どなたか
http://www.cns.ci.ritsumei.ac.jp/~kitano/exp1/ex3.html
の08、09の解析をしていただけないでしょうか?
453デフォルトの名無しさん:2007/05/15(火) 22:57:58
>>452
おまwwwwwwww立命乙wwwwwwww
454デフォルトの名無しさん:2007/05/16(水) 01:27:51
>>452
とっととfftかけろやw
使い方まで書いてあるやんwww
455デフォルトの名無しさん:2007/05/16(水) 01:33:43
ただデータ一個ずつ読み込んで関数に渡せばいいだけとちゃうん
456デフォルトの名無しさん:2007/05/16(水) 02:23:18
三角関数の値を出力したいのですが、
その出力する値をsin,cos,tanの3つのどれかから1つ選択できるようにするにはにはどのようにプログラムにすればいいのでしょうか?
457デフォルトの名無しさん:2007/05/16(水) 02:29:59
選ぶってことはプログラムに対してなんらかの入力を行わないといけないよな
だから入力を受け付ける関数を使えばいいんじゃないか?
458デフォルトの名無しさん:2007/05/16(水) 08:56:58
>>456
グラフを描く関数に引数としてかグローバル変数としてか、関数ポインタを渡せばいいでしょう
459デフォルトの名無しさん:2007/05/16(水) 08:58:07
グローバル変数は邪悪
460デフォルトの名無しさん:2007/05/16(水) 09:37:30
グローバル艦長は御髭
461デフォルトの名無しさん:2007/05/16(水) 10:34:58
>>458
そこでなぜ、「グラフ」?
#我々は神の御技を目の当たりにしているのか?w
462デフォルトの名無しさん:2007/05/16(水) 10:57:12
>461
「三角関数の値を出力」を脳内変換で「三角関数のグラフを出力」と置き換えてしまったと推測できる
463デフォルトの名無しさん:2007/05/16(水) 14:41:29
画像上の数点の座標を使って、その画像上に最小二乗法を使って直線を描くプログラムを作りたいんですが、誰か教えて欲しいです・・・お願いします。
464デフォルトの名無しさん:2007/05/16(水) 14:47:46
>>463
座標値から直線の式を求めたいのか、
直線を描画したいのか、
丸投げしたいのか、
ポイントを絞ってください。
465デフォルトの名無しさん:2007/05/16(水) 14:54:52
>>464
コメントありがとうございます。
座標値から直線を描画したいです。よろしくおねがいします。
466デフォルトの名無しさん:2007/05/16(水) 14:58:21
は?
1.座標値から直線の式を求める
2.直線を描画
3.丸投げ
数字で選べ
467デフォルトの名無しさん:2007/05/16(水) 16:26:22
>>464
1です。よろしくお願いします。
468デフォルトの名無しさん:2007/05/16(水) 16:30:14
469デフォルトの名無しさん:2007/05/16(水) 17:47:51
123
456
789
と二重ループと加算を用いて表示するプログラムを作りたいのですが
一体どうすればよいのでしょうか?

現在のソース

#include <stdio.h>

main () {
    int num;
    
    num = 0;
    
    while (10 > num) {
        //num = num + 1;
        
        while (num % 3 != 0) {
        //num = num + 1;
            printf ("%d"
                        ,num);
            }
        
        printf ("\n");
        }
    
    return 0;
    }
470デフォルトの名無しさん:2007/05/16(水) 17:54:47
for は習ってないの?
471デフォルトの名無しさん:2007/05/16(水) 17:55:10
その気持ちの悪いインデントは何式なの?
472デフォルトの名無しさん:2007/05/16(水) 17:56:33
if(hoge)
  {
  hage;
  }

というタイプのインデントなら見た事ある。
473デフォルトの名無しさん:2007/05/16(水) 17:58:34
>>469
縦横に並ぶ表を見たら、先ずは縦と横でループを回すことを検討しろ。
int num = 0;
for (int iy = 0; iy < 3; ++iy) {
for (int ix = 0; ix < 3; ++ix) {
++num;
printf("%d", num);
}
}
474デフォルトの名無しさん:2007/05/16(水) 18:05:56
>473
えらそうにしてても改行忘れてるからバカ丸出し
475デフォルトの名無しさん:2007/05/16(水) 18:15:29
紋切り型の表現を見つけるとすぐに「えらそう」と難癖つける香具師は多いが、
そんな輩に「バカ丸出し」と言われるほどのミスとも思えないが。

>>469
というわけで、>473の二つの}の間にprintf("\n);を補うこと。
476デフォルトの名無しさん:2007/05/16(水) 18:23:45
>>470
まだ習ってないです
それと、どうしてもwhileで作ってみたかったんです

>>471
多分、我流です

>>473
・・・解りそうで解らない
インクリメント、デクリメントがイマイチ解ってない上に、座標計算っぽいので
それをボクが使うのは少々早い気がします
whileでは無理なのでしょうか?

>>475
了解です
477デフォルトの名無しさん:2007/05/16(水) 18:30:09
これさ、変数一個で作ろうとすると微妙に難易度高いよね
478デフォルトの名無しさん:2007/05/16(水) 18:30:24
int num,iy,ix;
num = iy = ix = 0;
while(iy < 3) {
while(ix < 3) {
++num;
printf("%d", num);
++ix
}
printf("\n");
++iy;
}
479デフォルトの名無しさん:2007/05/16(水) 18:32:07
++ix → ++ix;
480デフォルトの名無しさん:2007/05/16(水) 18:36:41
>>477
詐欺臭いけどこういう方法とか

int main(void){
  int num = 0;
  while(num < 10){
    printf("%d",num++);
    while(num % 3 == 0){
      printf("\n");
    }
  }
  return 0;
}
481デフォルトの名無しさん:2007/05/16(水) 18:39:29
>473
頭悪そうな上にコード違ってるからバカ丸出し

というわけで、インクリメント位置をちょっとずらしてくれ、あと初期化値も1に
482デフォルトの名無しさん:2007/05/16(水) 18:42:04
>481
つ鏡
483デフォルトの名無しさん:2007/05/16(水) 18:45:35
>474は>480に「えらそうにしてても内側のwhileは入ったら無限ループだからバカ丸出し」と言うッ!
484デフォルトの名無しさん:2007/05/16(水) 18:45:48
>>478
これだとforの方が解り易いですね・・・

>>480
これぞ求めていた・・・!
と思ったら無限ループしますね(´・ω・`)

>>481
解りました
485デフォルトの名無しさん:2007/05/16(水) 18:52:18
>>481
0からスタートして、インクリメントしてから表示しているから問題ないんでない?
486デフォルトの名無しさん:2007/05/16(水) 18:59:47
#include <stdio.h>

int main(void)
{
   int num = 1;

   while(num<10) {
   printf("%d", num);
      if(num%3==0) putchar('\n');
   num = num + 1;
   }

return 0;
}

if習ってないなんてことはないよね?
487デフォルトの名無しさん:2007/05/16(水) 19:01:46
習っていないなら今ここで覚えればいいだけ
488デフォルトの名無しさん:2007/05/16(水) 19:07:58
覚えるのはいいけど、宿題にはならないよね。
489デフォルトの名無しさん:2007/05/16(水) 19:08:55
>>486
おお、まさにこれです!
流石にifは習っています

>>487
まぁ、そうなんですが・・・
forとかインクリデクリは、参考書やサイトを見てもイマイチなので・・・
switchとかgoto見たいなのは習わずとも解ったんですけどね・・・
490デフォルトの名無しさん:2007/05/16(水) 19:09:59
>>488
宿題じゃなくて、授業の復習みたいな感じです
491デフォルトの名無しさん:2007/05/16(水) 19:10:54
ここ超初心者が来ると途端に偉そうなのが大量にわくよなw
492デフォルトの名無しさん:2007/05/16(水) 19:12:30
だってスレタイの初心者が意味するところは
初心者が回答できるということだから
493デフォルトの名無しさん:2007/05/16(水) 19:26:50
forとwhileなんてほとんど同じ。
>486をforを使って書き直すと
#include <stdio.h>
int main(void)
{
   int num;
   for(num=1; num<10; num=num+1) {
      printf("%d", num);
      if(num%3==0) putchar('\n');
   }
   return 0;
}

num = 1 と num = num + 1 が()内に入っただけ
494デフォルトの名無しさん:2007/05/16(水) 19:39:45
489みたいなタイプは信じれる何か(先生とか本とか)に教わるまでは
新しいもの覚えるのに躊躇するんじゃない
無理して手伸ばす必要もないと思うけど
495デフォルトの名無しさん:2007/05/16(水) 20:01:08
そうか? 宿題でもないのに試してみる人だぜ?
496デフォルトの名無しさん:2007/05/17(木) 22:00:33
C言語って一定時間待つようなコマンドはあるんでしょうか?
497デフォルトの名無しさん:2007/05/17(木) 22:01:34
sleep()
498デフォルトの名無しさん:2007/05/17(木) 22:05:07
コマンドは(ry
499デフォルトの名無しさん:2007/05/17(木) 22:05:16
>>497
ありがとうございます、早速使ってみます
500デフォルトの名無しさん:2007/05/17(木) 22:06:04
コマンドって何?
501デフォルトの名無しさん:2007/05/17(木) 22:07:10
あー、すいません、ついその言葉使っちゃっただけです
502デフォルトの名無しさん:2007/05/18(金) 06:10:29
system("sleep 1");
503デフォルトの名無しさん:2007/05/18(金) 10:16:55
その話題もう終わってますから
504デフォルトの名無しさん:2007/05/18(金) 16:49:38
言語仕様には sleep なんかないけどな。
505デフォルトの名無しさん:2007/05/18(金) 18:17:56
ここは環境依存おkだし
506デフォルトの名無しさん:2007/05/18(金) 19:18:27
そうなのか?
507デフォルトの名無しさん:2007/05/18(金) 19:40:39
そうなの
508デフォルトの名無しさん:2007/05/19(土) 00:49:12
(A)アルファベットを入力してくださいというメッセージを出し、キーを入力させ

もし小文字アルファベットが入力されたら大文字アルファベットに変換し終了
もし大文字アルファベットが入力されたら小文字アルファベットに変換し終了
それ以外が入力された場合は、(B)再入力を可否をYかNで選択させる
Yなら一番最初(A)に戻り、Nなら終了
それ以外ならエラーを出し、Bに戻る
このエラーが10回繰り返された場合、終了させる

っていうのを作りたいんだけど、如何書けばいいかな?
509デフォルトの名無しさん:2007/05/19(土) 00:50:31
#include <stdio.h>
#include <ctype.h>

main () {
    char text;
    int num;
    
    while (1) {
        printf ("アルファベットを入力して下さい。\n");
        text = getchar ();
        
        if (isalpha(text)) { // 入力値がアルファベットならば
        
            // trans start
            if (isupper(text)) {
                text = tolower (text);
                printf ("入力されたアルファベットの小文字は %c です。"
                            ,text);
510デフォルトの名無しさん:2007/05/19(土) 00:51:11
                break;
                } else if (islower(text)) {
                    text = toupper (text);
                    printf ("入力されたアルファベットの大文字は %c です。"
                                ,text);
                    break;
                    }
            // trans end
511デフォルトの名無しさん:2007/05/19(土) 00:52:05
            // error start
            } else {
                num = 0;
                while (num != 10 || text != 'Y' || text != 'N') {
                    printf ("エラー\n"
                                "アルファベット以外の値が入力されました。\n"
                                "\n"
                                "継続して入力しますか?\n"
                                "Y/N\n");
512デフォルトの名無しさん:2007/05/19(土) 00:52:54
                    text = getchar ();
                    
                    switch (text) {
                        case 'Y':
                        case 'y':
                        continue;
513デフォルトの名無しさん:2007/05/19(土) 00:54:18

                        case 'N':
                        case 'n':
                        break;
                        
                        default:
                            ++num;
                        } //switch
                    } //while
                } // else
        } // while
    
    printf ("\nExiT");
    
    return 0;
    }
514デフォルトの名無しさん:2007/05/19(土) 01:14:23
>>580の未完成ソース >>509-513

フロー
http://www.borujoa.org/upload/source/upload11690.xxx
拡張子 .odg
515デフォルトの名無しさん:2007/05/19(土) 02:43:34
int nAll[4800000];
みたいな巨大な配列を宣言すると、アプリエラーになってしまいます。
どうやれば巨大な配列を使えるのでしょうか?
516デフォルトの名無しさん:2007/05/19(土) 02:46:11
mixiで暴れてる猫皇って何者?激しく不快なんだけど

C言語コミュ
http://mixi.jp/view_community.pl?id=1190894
初心者の為のC言語
http://mixi.jp/view_community.pl?id=485919
517デフォルトの名無しさん:2007/05/19(土) 02:51:06
20万以上とか200万以上とか大きな配列を宣言しようとすると,リンカがエラーを吐くらしいよ
(どのくらいまで大丈夫かはリンカによる)

mallocで動的確保する場合は無限大に出来ると思う・・・
でもint型を一気に何億も動的確保しようとすると,当然メモリ不足になるから
またやりたいことによって色々なやり方を考える必要がある

518デフォルトの名無しさん:2007/05/19(土) 02:56:08
例えば,int型で1000億の大きさ(4*100億byte≒40GB↑)が必要な計算結果を保存しておきたい場合ってどうしたらいいんだろうね?
メモリ増設しても足りないから、他のコンピュータを何百台も繋げてメモリ借りるしかないのかな?

多倍長計算とか
int[]一要素に10進数で10桁くらいしか記憶できないから,何億桁,何無量大数桁もの計算結果をコンピュータで扱いたいときは・・・どうすれば??
519デフォルトの名無しさん:2007/05/19(土) 02:57:18
磁気ディスクに書け。
520デフォルトの名無しさん:2007/05/19(土) 02:57:24
>>515
そもそもそんなに大きな配列を一度に扱う理由が…。
ファイルをメモリに見立ててランダムアクセスするとか、
処理の前にサイズを計算して必要な分だけ動的確保するとか、
アプローチを考え直す方が良いかも?
521デフォルトの名無しさん:2007/05/19(土) 02:58:21
ファイルに書き出して扱うとか?手間や処理時間は掛かるだろうけど、手段を選べばやれないことはない。
ってか、可能な範囲内で配列をもっと多く宣言できるといった話をこの板のどこかのスレで聞いた覚えが・・・
522デフォルトの名無しさん:2007/05/19(土) 02:59:09
宇宙分野の科学技術計算でそのくらい必要かと思いましたが,そうでもないのでしょうか?
素人なのでよく知りませんが
523デフォルトの名無しさん:2007/05/19(土) 02:59:55
ソートであれば外部ソートてのがある。
524デフォルトの名無しさん:2007/05/19(土) 03:00:27
ファイルに書き出すらな何百GBものメモリが利用できるな
スワップみたいなもの?
525デフォルトの名無しさん:2007/05/19(土) 03:01:47
詳しく知らないけどアポロ計画の物理演算用コンピュータは
処理性能は数年前の古臭いPen2パソコンと比べても遥かに劣るらしいぞ。
ノイマン型かどうかすら怪しいけど。
526デフォルトの名無しさん:2007/05/19(土) 03:02:29
>>521
俺も半年くらい前にこの板のどこかのスレで聞いたことがある
なんかオプションを指定してやるんだっけな?まぁコンパイラの説明書嫁
527デフォルトの名無しさん:2007/05/19(土) 03:02:39
ファミコン並とも言われてるしな
528デフォルトの名無しさん:2007/05/19(土) 03:03:09
>>522
素人なのに、40GBの計算結果が出るって、
一体どうやって見積もったんだ?

どんな技術計算でも、桁数多ければいいってのは無いだろ。
PIの計算でギネス狙うとかじゃない限りさ。
529デフォルトの名無しさん:2007/05/19(土) 03:03:10
メモリマップトファイルでいいじゃん
530デフォルトの名無しさん:2007/05/19(土) 03:03:22
俺の頭波とも(ry
531デフォルトの名無しさん:2007/05/19(土) 03:04:20
>>528
実際の航空宇宙分野現場ではどのくらい使われているのでしょうか?
532デフォルトの名無しさん:2007/05/19(土) 03:05:08
大量のフラグが必要なのですが、何億も使うわけではなく数百万ぐらいが必要です。
とりあえずmallocでやってみます。
ありがとうございました。
533デフォルトの名無しさん:2007/05/19(土) 03:08:29
>>515
int n;
桁数を入力⇒scanfでnに代入

int *a = (int *)malloc(sizeof(int) * n);
if( a == NULL ){ printf("メモリ確保失敗\n"); exit(1); }


この方法だとsigned int型のnに27億くらいしか指定できない
534デフォルトの名無しさん:2007/05/19(土) 03:09:56
320ギガビット整数なら1.03e+11桁くらい扱えるようですね。
535デフォルトの名無しさん:2007/05/19(土) 03:13:35
Pythonだとデフォルトで何桁でも計算してくれるんだっけ
536デフォルトの名無しさん:2007/05/19(土) 03:13:57
まさか
537デフォルトの名無しさん:2007/05/19(土) 03:20:03
Pythonコマンドラインで計算してみた

>>> 54354353453453535435 * 54353444444444444
2954346330745983744467924576242873140L

Lって出てきたけどCよりはるかに多い
538デフォルトの名無しさん:2007/05/19(土) 03:22:17
>>533
unsigned int制限の27億以上入力したいなら nもまた配列やポインタにしなきゃいけない
ってなるとコードがゴチャゴチャ
539デフォルトの名無しさん:2007/05/19(土) 06:40:36
>>538
そうなったcを諦めてc++で書けばすっきり。
540デフォルトの名無しさん:2007/05/19(土) 13:24:41
横からスマンがC++はどうなるんですかい?
541デフォルトの名無しさん:2007/05/19(土) 13:33:15
普通に考えてsize_tで表せるサイズ以上の確保は無理だろ
542デフォルトの名無しさん:2007/05/19(土) 14:11:51
連続領域である必要などどこにもない
543デフォルトの名無しさん:2007/05/19(土) 14:33:01
大きすぎる場合はメモリだけじゃどうしようもないから
ディスクを利用したりするよ。
あるいはクラスターマシンで並列化するとか。
544デフォルトの名無しさん:2007/05/19(土) 14:44:06
あるいはターミナルに出力してオンデマンドで打ち込んでやるとか。
545デフォルトの名無しさん:2007/05/20(日) 05:21:14
なんか自分のプログラムのコメントの書き方が汚いような気がします。
どういうコメントのつけ方をすれば綺麗で見やすいプログラムになるのでしょうか?
自信のある方、注意やレイアウトなどを教えて頂けると幸いです。
546デフォルトの名無しさん:2007/05/20(日) 06:17:03
ソースを書く前にプログラムの内容や流れをきちっとまとめなさいと。
ライブラリを用いて、この部分ではどういう役割を持った記述をするのかはっきりと定義すること。
547デフォルトの名無しさん:2007/05/20(日) 15:57:06
形式はJavadoc, Doxygenに倣えばよし。
実際のコツということなら他人のソースをある程度読み込んで
良いところはパクリ、悪いところは反面教師とすればよし。
548デフォルトの名無しさん:2007/05/20(日) 16:29:14
doxygenとsandcastleみたいなXMLコードコメントスタイルってどちらがいい?
549デフォルトの名無しさん:2007/05/20(日) 16:31:44
自分で決めろよ。
550デフォルトの名無しさん:2007/05/20(日) 16:34:25
そりゃ開発環境や使うツール次第だろ。
VSなら実質XMLDoc一択だし。
もし一切の入力支援なしということならDoxygen&JavaDocスタイルが楽だと思う。
551デフォルトの名無しさん:2007/05/26(土) 08:29:14
これからCでプログラムを書けるようにしたいんですが、
本やホームページによって、0から文字だけを打って作っていくものもあれば、
VisualCを使って、視覚的にウインドウも同時に作っていくものもあります。
これは、どちらの方法でもC言語のスキルとしては同じレベルまで身につくのでしょうか。
それとも、違うものとして認識したほうがよいでしょうか。
552デフォルトの名無しさん:2007/05/26(土) 08:34:37
行き着く先は一緒だろ
視覚的なほうがモチベーションの維持が楽だから、そっちでやったらどうよ
あんまりプログラミングしてる気分にはなれないかもしれないけど
553デフォルトの名無しさん:2007/05/26(土) 08:45:30
いいえ。
554デフォルトの名無しさん:2007/05/26(土) 08:53:16
C++ではなくC言語にあえて拘るなら、組込用途に特化した方がいいと思うよ。
たとえば、GBAとかかWonderWitchのような携帯ゲームとか
秋月電子でH8とかM16のボードキットとか のプログラムをやるとかさ
555デフォルトの名無しさん:2007/05/26(土) 09:52:38
>>551
君は、C言語がやりたいのか、C++がやりたいのか
556デフォルトの名無しさん:2007/05/26(土) 10:36:01
16進数は0xをつけますが、2進数はどのように書けばよいのでしょうか?
557デフォルトの名無しさん:2007/05/26(土) 10:44:21
どのようにも書けません。
558デフォルトの名無しさん:2007/05/26(土) 11:28:19
>>551
質問を思いっきり無視するが
・C/C++の言語・標準ライブラリの学習
・Visual Studioの使い方、Win32API, MFC, .NETフレームワーク等の学習
・自分の作りたいもの
をバランスよくやっていくのが吉。
特にデバッガの使い方は早めに習得しておくといいよ。
559デフォルトの名無しさん:2007/05/26(土) 12:11:56
>>551
出だしはGUIだろうがCUIだろうが、どっちでも一緒じゃない?

俺の経験で言えば、mallocやprintfを自分で実装するような世界へ行かないと
C言語の深淵は見えてこないと思う。

まぁそこまで行っちゃうと環境への依存性強すぎて
「C言語のスキル」と言えるかどうかは謎だけど・・・
560デフォルトの名無しさん:2007/05/26(土) 12:41:21
環境依存こそC言語のスキルだと思うよ。
違う中での共通項に、身に付けるべき概念があるわけだろうからね
561551:2007/05/26(土) 13:10:13
>>555
C言語です。

みなさん、ありがとうございました。
やっぱりモチベーションのことがあるので、
今はGUIで、いろいろな面から進めていきたいと思います。
562デフォルトの名無しさん:2007/05/26(土) 13:12:26
でも、CUI → GUI の方が良いよ
563デフォルトの名無しさん:2007/05/26(土) 13:29:09
>>561
君の目指すところがわからないんであれだが
単にC言語を覚えたいだけなら、CUIのほうが良いと思うぞ
GUIだと言語以外に覚えないといけないことが多すぎるし
C言語でWindowsアプリは入門者にはきついと思うぞ
564551:2007/05/26(土) 14:17:48
>>562
基本部分はCUIの方が勉強になるということですか。

>>563
情報が少なくてすみません。
目標としては、Windowsアプリであれば、簡単なメモ帳程度から初めて、
ウェブブラウザが作れるくらいまでいけたらと思っています。
また、WindowsだけではなくLinuxも使っているので、
Linuxでも動くプログラムが書けるようになりたいと思っています。
そこで、C言語で基本を押さえておいて、Windowsアプリを作りたくなったら
C系のほかの言語に移るのもありかなと思っています。
とすると、C言語はまずCUIでやるべきでしょうかね。
565デフォルトの名無しさん:2007/05/26(土) 14:26:42
Cだとメモ帳を作るってだけでも・・・まあEDITコントロールを貼れば無理ってほどじゃないが
結構負担の大きいチャレンジだと思うぞ。

さらにブラウザを作るってのも、ActiveXでIEを貼るとしたって、まあ、初心者の目標としては、まず無理。

GUIがやりたいなら、Delphiとかである程度作法や仕組みがわかってからやった方がいいと思うぞ。
566563:2007/05/26(土) 14:30:24
>>564
そういう目標ならC言語はまったくお勧めしない
C#あたりからはじめたほうがいいと思うよ
567551:2007/05/26(土) 14:39:07
分かりました。親切にありがとうございました。
別の言語から勉強していきたいと思います。
568デフォルトの名無しさん:2007/05/26(土) 16:31:47
ic = ia&ib;

はどのような意味を持ち合わせているのでしょか?
569デフォルトの名無しさん:2007/05/26(土) 16:34:51
>>568
その質問は数学者に1+1の意味を尋ねているようなものだ
570デフォルトの名無しさん:2007/05/26(土) 16:34:59
未定義の識別子icに未定義の識別子iaと未定義の識別子ibのAND演算の結果を代入する
571デフォルトの名無しさん:2007/05/26(土) 16:37:54
>>568
意味は、どう抽象化してるかによって違ってくる。
ビットをクリアしてるのかもしれないし
モジュロ演算の代用かもしれないし、
572デフォルトの名無しさん:2007/05/26(土) 16:43:02
書き忘れてました、

ia=0x0B0A; ib=0x0F0A;
です
573デフォルトの名無しさん:2007/05/26(土) 16:58:37
それじゃ、ic = 0x0b0a & 0x0f0a;ということだ。
574デフォルトの名無しさん:2007/05/26(土) 22:42:22
>>555,556辺りを見て思ったんですけど、
逆にC言語に向いてるものってなんですか?
575574:2007/05/26(土) 22:43:17
アンカミスorz
>>565,566
でした。
576デフォルトの名無しさん:2007/05/26(土) 22:47:41
C言語に向いてるのは>>554のような組込マイコン向けの開発なんかだね
577566:2007/05/26(土) 22:49:55
>>575
CUIプログラム、サーバプログラム、組込み系、デバイスドライバ、OS、学校の宿題

適当に思いついたものを列挙してみた
578574:2007/05/26(土) 23:10:17
そうか。学校の宿題は別として、比較的低級なものととらえられそうですね。
ありがとう。
579デフォルトの名無しさん:2007/05/26(土) 23:29:13
GUIがつけばなんでも高級だと思える人が多いからね。
580デフォルトの名無しさん:2007/05/26(土) 23:30:07
プログラマでその発言はあまりにも痛いぞ
581デフォルトの名無しさん:2007/05/27(日) 00:25:57
学校の宿題は高級なんだ……
582デフォルトの名無しさん:2007/05/27(日) 00:32:35
ん?574の低級はそういう意味の低級だったのか?
583デフォルトの名無しさん:2007/05/27(日) 00:44:24
レベルの高低とレイヤの高低を混同しちゃうのかよ
584デフォルトの名無しさん:2007/05/27(日) 01:02:44
商品は見た目が大事
585デフォルトの名無しさん:2007/05/27(日) 03:47:07
C言語は「低水準」だが「低級」ではない、って話は黎明期によく聞いた。
586デフォルトの名無しさん:2007/05/27(日) 07:47:30
アセンブラだって機械語からすれば高級言語
スクリプト系/VM系が発達してきてるから
最近はCも低級言語って言われ始めてるよね
587デフォルトの名無しさん:2007/05/27(日) 08:27:27
低級ってハードウェアに近いってことじゃないの?
組み込みだったり、ドライバだったり、OSだったりって
全部ハードウェアについて詳しく知らないとできないじゃない。
588デフォルトの名無しさん:2007/05/27(日) 09:47:19
>>586
> 最近はCも低級言語って言われ始めてるよね
うちの近所じゃ, 昔から高級アセンブラって言われますが...
589デフォルトの名無しさん:2007/05/27(日) 09:53:09
アセンブラやってる俺から見ればCなんてクソ言語
なんでまともなコード出力しないんだあれ?
590デフォルトの名無しさん:2007/05/27(日) 09:55:04
それは言語のせいではなく、処理系のしかもコードジェネレータのせい。
591デフォルトの名無しさん:2007/05/27(日) 09:57:15
>>589
あなたの雇用を守ってあげるためですよ
592デフォルトの名無しさん:2007/05/27(日) 10:16:06
>>589
値段の安いのかフリーしか使わないからじゃないの?
あと、アセンブラ出力見ながら、書き方を調整するといいよ。
593デフォルトの名無しさん:2007/05/27(日) 10:23:27
>>589が吐くアセンブラもひどいもんだがなw
594デフォルトの名無しさん:2007/05/27(日) 10:32:06
>>589
Woodcrest用にiccよりも高速なコードを書けるのなら、是非ご協力願いたい。
当方「手段を問わず高速化」を求められているプロジェクトに参加しているので。
595デフォルトの名無しさん:2007/05/27(日) 11:27:59
>>588
>> 最近はCも低級言語って言われ始めてるよね
>うちの近所じゃ, 昔から高級アセンブラって言われますが...
んなこたねえだろ
うちでは、高級マクロアセンブラと呼んでたぞ
596デフォルトの名無しさん:2007/05/27(日) 11:29:30
お前のせいで高級マグロ食いたくなった
597デフォルトの名無しさん:2007/05/27(日) 12:40:30
>>594
             「 ̄ `ヽ、   ______
             L -‐ '´  ̄ `ヽ- 、   〉
          /           ヽ\ /
        //  /  /      ヽヽ ヽ〈
        ヽ、レ! {  ム-t ハ li 、 i i  }ト、
         ハN | lヽ八l ヽjハVヽ、i j/ l !
         /ハ. l ヽk== , r= 、ノルl lL」
        ヽN、ハ l   ┌‐┐   ゙l ノl l
           ヽトjヽ、 ヽ_ノ   ノ//レ′
    r777777777tノ` ー r ´フ/′
   j´ニゝ        l|ヽ  _/`\
   〈 ‐ 知ってるが lト、 /   〃ゝ、
   〈、ネ..         .lF V=="/ イl.
   ト |お前の態度が とニヽ二/  l
   ヽ.|l         〈ー-   ! `ヽ.   l
      |l気に入らない lトニ、_ノ     ヾ、!
      |l__________l|   \    ソ
598デフォルトの名無しさん:2007/05/27(日) 13:27:16
何を知ってるというのだ?
599デフォルトの名無しさん:2007/05/27(日) 15:41:51
無知の知を知ってるんだろ
600デフォルトの名無しさん:2007/05/27(日) 15:46:42
borland5.5を導入して
コンパイルしようと思ったら下記エラー発生。

C:\cp>bcc32 hello.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
hello.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Fatal: ファイル C0X32.OBJ が開けません



記述コードはごくごく単純。
#include <stdio.h>

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

これって何で起きるんでしょう?環境?
ちなみにborland5.5を導入する前にVisual Studio2003も導入しています。
601デフォルトの名無しさん:2007/05/27(日) 15:47:32
bccはフォルダにコピーするだけじゃなく環境設定が必要だぞ。
詳細はググレカス
602デフォルトの名無しさん:2007/05/27(日) 15:52:26
>>600はborland5.5を導入したって言ってるんだからそれは無いな
603デフォルトの名無しさん:2007/05/27(日) 15:58:57
ちなみにC\cpには
元ソースであるhello.cと、hello.objが作成されています。

本来であればhello.exeが出来なきゃいけない?と思うのですが・・・。
bccの環境設定は出来ていると思います。
604デフォルトの名無しさん:2007/05/27(日) 16:02:39
>>594
手段を問わず高速化するならまず大量の資金をインテルに投じて、
人的にも設備的にも最高品質の資源を世界中からかき集めて、
woodcrestの性能向上を図るべきだな。
もうアーキテクチャから何からあらゆるものを変えて名前だけを残すくらいに。
605デフォルトの名無しさん:2007/05/27(日) 16:05:53
>>603
だからよ、EXEを作るのにC0X32.OBJが必要なんだよ。
LIBの設定やってないんじゃないのか?
説明読んだか?
606デフォルトの名無しさん:2007/05/27(日) 16:06:39
とりあえず環境変数を晒すんだ
607デフォルトの名無しさん:2007/05/27(日) 16:07:22
>>603
readmeくらい読めと
608デフォルトの名無しさん:2007/05/27(日) 16:07:55
すいません、自己解決しました。

LIBの設定はしていたのですが、単純なタイピングミスでした。
修正したところ、無事コンパイルが通りました。

レスいただいた方、ありがとうございます。
609デフォルトの名無しさん:2007/05/27(日) 16:09:19
>>603
本当に設定できてるのか?
binディレクトリにちゃんとbcc32.cfgがあるか確認汁
bcc32.cfgが無かったり、きちんと設定が書かれていないときに出る症状だぞ
610デフォルトの名無しさん:2007/05/27(日) 16:16:15
>>609
bcc32.cfgは作成しました。
とりあえず教本の通り進めているので、現状は問題ないと思います。

ちなみに教本は本屋の雑誌コーナーで買った
日経ソフトウェアの「ずばりわかる!C言語 Cプログラミングの基礎を徹底理解」という
A4サイズのオレンジ色の本です。(ISBN978-4-8222-2840-8)
611デフォルトの名無しさん:2007/05/27(日) 17:47:15
>>610
環境変数でLIBを設定したらbcc32.cfgの設定より優先されるからね。
612デフォルトの名無しさん:2007/05/28(月) 13:56:28
プログラミングの課題で

【直角三角形の長辺と底辺の値をキーボードから入力し、
その二辺の角度(°)を画面に表示するプログラムを作成せよ】

って課題で、先輩に聞いてもわからないらしい

何かヒントを教えてくれないだろうか?
613デフォルトの名無しさん:2007/05/28(月) 14:00:42
つarccos
614デフォルトの名無しさん:2007/05/28(月) 14:03:28
>>612
それのどこがCの質問?
#寧ろ中学数学だろうよ
615デフォルトの名無しさん:2007/05/28(月) 14:07:27
なんという馬鹿学校
616デフォルトの名無しさん:2007/05/28(月) 14:07:42
>>613
acosを使うとうまく値が出てこない

>>614
確かにその通りだ
数学がわからないからプログラミングができない
617デフォルトの名無しさん:2007/05/28(月) 14:29:38
うまく値が出てこないのはacosを使ったからではなく、お前が使い方を間違ってるから。
しね
618デフォルトの名無しさん:2007/05/28(月) 15:24:14
ポインタが有って良かった
っていうケースについて教えて下さい

ポインタは何となく分かりましたが
「これがあるとこんな恩恵に預かれる!」
ってのがイメージ出来ません
変数の実態に値入れれば良いじゃん
って思っちゃいます

ポインタがなければ実現しえないケースでも良いです

誰かサンプルケース下さい
619デフォルトの名無しさん:2007/05/28(月) 15:28:39
>>618
例えば巨大な構造体をある条件でソートする場合
構造体そのものを入れ替えるとすごく時間が掛かる
「構造体のポインタ」をソートすると速い
620デフォルトの名無しさん:2007/05/28(月) 15:29:04
標準入力でテキストを読み込んでソートして結果を標準出力に書き出すプログラム作ってみろ。
621デフォルトの名無しさん:2007/05/28(月) 15:40:56
>>620
2chは言い出しっぺが作る法則
622デフォルトの名無しさん:2007/05/28(月) 15:49:51
>>618
NULL入れて、ニヤニヤできます。
623デフォルトの名無しさん:2007/05/28(月) 15:57:40
>>618
参照を持ってる言語だと >>619のようなメリットも参照で代用出来るわけで

唯一あるとすれば、字句解析の場合かな
字句解析では 現在の文字、次の文字に進む、最後の文字か? の3要素が必要だけど
ポインタだけでこの3要素を実現出来て高速。
624デフォルトの名無しさん:2007/05/28(月) 16:00:06
恐ろしく的外れなレスをミ田
625デフォルトの名無しさん:2007/05/28(月) 16:08:20
C言語スレだよな?
626デフォルトの名無しさん:2007/05/28(月) 16:24:45
>>618
scanf()の実装。
627デフォルトの名無しさん:2007/05/28(月) 16:27:16
>>618
じゃ、勝手に ここまでのまとめ

ポインタには 参照 reference の代用としての用途と それに収まらないアドレスそのものとしての用途の2つがある。
参照とはそれ自身はデータではなく、外にあるデータを指しているというもの
scanfのように、関数の引数に値を返すような場合が参照渡しの代用例

参照に収まらない用途の例は、while(*p++) if(*p==',') break; のような使い方。
文字列が連続したメモリ上にある事を利用し、
ポインタがメモリのアドレスを示す特性を使って、高速に文字スキャン等を行うというもの
628デフォルトの名無しさん:2007/05/28(月) 16:28:30
ここまで読み手に配慮しないオナニーレスも珍しい
629デフォルトの名無しさん:2007/05/28(月) 16:42:58
>>612
#include <cstdio>
#include <cstdlib>
#include <cmath>

#define M_PI 3.14159265358979323846

int main() {
double hypot=0, base=0;
scanf_s("%lf%lf", &hypot, &base);
if (hypot == 0) exit(0);
double angle = acos(base/hypot);
printf("%lf°", angle/M_PI*180);
return 0;
}
630デフォルトの名無しさん:2007/05/28(月) 16:45:25
>>629
スレ違い。
631デフォルトの名無しさん:2007/05/28(月) 17:04:32
>>614
acos は高校ですら習わないことないか?
632デフォルトの名無しさん:2007/05/28(月) 17:06:05
>>618
C だと、そもそもポインタがないと関数への配列の受け渡しが不可能。
633デフォルトの名無しさん:2007/05/28(月) 18:16:45
>>631
驚くべきことに大学にずれ込み始めてきている
634デフォルトの名無しさん:2007/05/28(月) 18:18:01
あ、読み違えてしまった
635デフォルトの名無しさん:2007/05/28(月) 18:19:50
ずれ込み始めても何も、
acos を高校までに教えてた時代っていつだ? あるの?
ましてや中学って。
636デフォルトの名無しさん:2007/05/28(月) 18:28:47
高校でも工業系ならやると思うよ。 高専なら1年でやるんじゃないかな
637デフォルトの名無しさん:2007/05/28(月) 18:37:10
逆三角関数を知らなくても、そういうものがあれば求められるくらいの頭はあるだろ。
少なくとも私は関数電卓に遭遇した中学時代には承知してたよ。
638デフォルトの名無しさん:2007/05/28(月) 18:38:49
俺なんて関数ってもの知ったの大学入ってからだし
639デフォルトの名無しさん:2007/05/28(月) 18:43:10
ラジアンも知らない人間に acos 使えとだけ言っても、
トンチンカンな答えが返ってきても仕方がないと思われ。
640デフォルトの名無しさん:2007/05/28(月) 18:47:55
同じく関数電卓にあったので高校で初めて触れたbasicで普通にラジアンを使ってた漏れ。
つーか、今時判らなければ調べるのが当たり前だろ。
641デフォルトの名無しさん:2007/05/28(月) 20:38:26
弧度法なんか中学で習った覚えがあるんだが、今の指導要領だと高2なのな。
なんというゆとり。
642デフォルトの名無しさん:2007/05/28(月) 20:41:44
10年以上前でも高2だったというのに、
中学で習ったって人は一体何歳なんだろう?
40代?
643デフォルトの名無しさん:2007/05/28(月) 20:48:54
http://www.mext.go.jp/b_menu/shuppan/sonota/990301c/990301m.htm
√は教えても、
>解の公式は取り扱わないものとする。
>平方根表は取り扱わないものとする

へえ・・・・1.4142 とかも教えないとは・・・・
644デフォルトの名無しさん:2007/05/28(月) 20:54:46
>>642
S35の指導要領で高1だな。
645デフォルトの名無しさん:2007/05/28(月) 21:10:13
>>643
解の公式はやらなかったので、何でも平方完成で解いた
1.4142...は雑談程度には出てきた
646デフォルトの名無しさん:2007/05/28(月) 21:14:31
アホほどくだらない話題に嬉々としてわいてくるな
647デフォルトの名無しさん:2007/05/28(月) 21:30:29
>>644
40代でも高校ということは、
50〜60代くらいか? 中学は。
あるいは、その時代の進学校なら、
中学でも触れてる可能性はあるのかもしれんが・・・。
648デフォルトの名無しさん:2007/05/28(月) 21:35:08
中高一貫校なら高1の内容を中3でやるのかもしれないな
649デフォルトの名無しさん:2007/05/28(月) 21:36:15
俺もラジアンは中学で習ったな。私学だけど。
650デフォルトの名無しさん:2007/05/28(月) 21:44:26
まあ、正直三角関数くらい中学でやっていいような内容だと思うけどね。
651デフォルトの名無しさん:2007/05/28(月) 22:38:01
だから、習わないと使っちゃいけないわけじゃあるまいし、調べればいいだけのことだろ。
652デフォルトの名無しさん:2007/05/28(月) 22:51:00
何が「だから」だよ。みんなそう言ってるじゃないか。
653デフォルトの名無しさん :2007/05/29(火) 04:46:50
正直高校や大学で一通り数学、物理の知識を身につけても
結局その知識を使う環境が無いまま年齢重ねると
公式や、微分の基礎なんて忘れちまうよ。
あの頃はすらすら解けたのにっていうのがざらにある。
社会人になったら、そういう部分よりも必要なスキルやコミュニケーション能力等
が重要になる。

ま、結局必要な分野の知識以外はおのずと薄れていってしまう。
654デフォルトの名無しさん:2007/05/29(火) 04:52:24
プログラミング言語もしかりだな。
使わない言語は勉強しても忘れる。
655デフォルトの名無しさん:2007/05/29(火) 06:39:41
英語もだ。
656デフォルトの名無しさん:2007/05/29(火) 06:44:50
俺英語バリバリだよ?
I'as pen!
657デフォルトの名無しさん :2007/05/29(火) 07:35:55
>>656の書き込みを見て高校時代の会話を思い出した
俺「俺、もう中学レベルから英語わからへんわ」
ツレ「中学レベルっていったら、I am a Penとかやろ」
俺「まぁ、それくらいやったら解るけど」


数日後
俺「I am a Penってどういう意味やねん!」
658デフォルトの名無しさん:2007/05/29(火) 09:52:40
私はPenです
659デフォルトの名無しさん:2007/05/29(火) 11:35:22
あたいアペン、よろしくね☆
660デフォルトの名無しさん:2007/05/29(火) 15:58:24
You is big fool man hahaha
ってやつ?
661デフォルトの名無しさん:2007/05/29(火) 18:08:58
You って名前の人か。
662デフォルトの名無しさん:2007/05/29(火) 21:19:43
もう10年も昔の話なんだな>you is a big fool man
663デフォルトの名無しさん:2007/05/29(火) 21:39:43
All your base are belong to us.ってなんであんなにうけたんだろう
664デフォルトの名無しさん:2007/05/29(火) 22:11:59
>>663
「日本は反省しる」とだいたい同じような感じでうけた。
つまり超シリアスな場面でまじめな顔をしてそんな間抜けなことをやらかしたから。
665デフォルトの名無しさん:2007/05/29(火) 22:14:19
>>663
超シリアスな場面で使われたことがポイントらしい。
「反省しる!」も韓国の議員が背広姿で大真面目に日本の国会議事堂前で
かましてくれたからこそ、大きな意味がある。
666デフォルトの名無しさん:2007/05/29(火) 22:15:13
分単位で遅れて思いっきり被った。orz
667664:2007/05/29(火) 22:26:00
似たような語彙で説明してるのがウケタw
もう結婚しているので、結婚は勘弁してください。
668665:2007/05/29(火) 22:30:33
じゃぁ、別れてなんて言わないから愛人にしてください。
669デフォルトの名無しさん:2007/05/30(水) 01:33:20
「じゃあね」なんて言わないで〜
670デフォルトの名無しさん:2007/05/30(水) 01:42:15
アノコにもしも飽きたらすぐに呼び出して〜
671665:2007/05/30(水) 02:34:08
>>669-670
XBOXも持ってないのになぜかそのCDが手元にあるw
672デフォルトの名無しさん:2007/05/30(水) 13:17:31
関数内で取得した文字列を戻り値として返したいのですが、
そのような方法はありますか?

関数内で取得した文字列は関数内のローカル配列に格納するので、
配列の先頭アドレスを返そうとすると、
function returns address of local variable
といわれてしまいました。
673デフォルトの名無しさん:2007/05/30(水) 13:20:34
staticにするか、
動的に割り当てた領域を返すか(開放は呼び出し元の責任で)、
文字数の最大値が決まっているなら呼び出し元が割り当てたものを関数に渡して
それに入れてもらうか。
674デフォルトの名無しさん:2007/05/30(水) 13:24:41
static変数を用意するタイプ
printf("%s, %s", getstr(), getstr())
のように同時に使うとバッファが一箇所にしかないのでおかしくなる。
char *getstr()
{
 static char buf[256];
 return buf;
}

mallocして返すタイプ
呼び出し側できっちりfreeしてやる必要がある。
malloc/freeが対になっていないのでいまいち。
char *getstr()
{
 char *ret = malloc(256);
 return ret;
}

呼び出し側にバッファを用意させるタイプ
使う側は多少面倒だがCではこっちが一般的。
char *getstr(char *buf)
{
 return buf;
}
675デフォルトの名無しさん:2007/05/30(水) 13:27:11
すみません、FTPモードでMS-DOSプロンプトを操作したいのですが、
MS-DOSプロンプトの時と違って、FTPモードではsystem()関数が使えません。

system("ftp localhost") ここまでsystemで実行されるようなんですが、
FTPモードになった時は、system関数に相当するものはあるのでしょうか?
とりあえずUserとPasswordを入力してログインがしたいです。
どなたか分かる方、宜しくお願いします。
676デフォルトの名無しさん:2007/05/30(水) 13:47:01
ftpは全コマンドをファイルにしてそれを実行することができるが
そうでないなら、自分でソケット開いてftp操作すれば。
ソースだってあるし、そんなに面倒じゃない。

あとは、呼び出すコマンドが対応していれば、パイプでつなぐ手もあるけど
677デフォルトの名無しさん:2007/05/30(水) 14:04:21
なんかよくわかんなくなった
char *pってやったら
pはポインターだけど、char型でint型を示すことはできない

int *func(int x)
ってやったら
funcはポインターの値(0123456Fとか)を返すけど、そのポインターはint型を示すなので
p=func(10)とかはできないけど
int *a;
a=func(10)はできる

*←このマークが、これはポインターだよってことを示す印で・・・
構造体の場合

struct kozo{
int x;
int *p;
};

これの場合、a=kozo.pはできて
a=kozo.*pじゃないよね?
678デフォルトの名無しさん:2007/05/30(水) 14:12:29
>>676
回答ありがとうございます!!
すいません、自分でソケット開いてftp操作と言うのが
今ひとつわかりません・・。
一応、ソケットのクライアントとサーバーを作り、
相互で通信(文字を送るだけ)はできました。
何度も申し訳ないのですが、ソケットを開いてFTPの操作と言うのは、
具体的にどういった処理になるのでしょうか?
679デフォルトの名無しさん:2007/05/30(水) 14:27:04
ちょっとわからん・・・
int x=2;
は正しいのに
int *p;
*p=2は正しくて
int *p=2はエラーになるのはなんで?
680デフォルトの名無しさん:2007/05/30(水) 14:31:07
連続スマソ。。。最後にこれだけ聞いてくれ

引数そのものを変える参照渡しの応用っぽい感じで
pにxのアドレスを入れるってのはどうやればいい?
これだと参照渡しにならないことはわかるんだけど
**pってやってもエラーになってわからん。
普通にp=&xってやりゃいいんだけど、それをあえて関数を使ってやった場合どうなるかって考えてたんだけど

#include <stdio.h>
#include <stdlib.h>

void func(int *p,int x);

int main(void){
int x=2;
int *p;
*p=3;
printf("pのアドレスは%p\n",p);
printf("xのアドレスは%p\n",&x);
func(&p,x);
printf("pのアドレスは%p\n",p);

return 0;
}

void func(int *p,int x){
p=&x;
}
681デフォルトの名無しさん:2007/05/30(水) 14:34:01
>>680
思いついたそばから書き込まないように。
関数にはコピーを渡すんだからそのアドレス持ってきたってどうにもならん。
682デフォルトの名無しさん:2007/05/30(水) 14:36:54
>>679
(int *) p = 2;
はダメだろ?

そのあたりは、Cの定義の仕方が勘違いしやすい原因
ポインタは typedef して 考えてみるといいよ
683デフォルトの名無しさん:2007/05/30(水) 14:38:38
>>677
>char *pってやったら
>pはポインターだけど、char型でint型を示すことはできない

charとintでは変数のサイズが違うからな。
例えば…

char ,*p;
int *q;

とした場合、

p++; → p=p+sizeof(char); (p=p+1ではない)
q++; → q=q+sizeof(int); (q=q+1ではない)

となる。

charポインタなのにint変数を指すと、ポインタを動かした場合にint変数の中途半端なところを指してしまいおかしいことになる。
684デフォルトの名無しさん:2007/05/30(水) 14:45:15
>>680
func関数でmalloc関数を使って領域を確保して、確保した領域を指すアドレスを返す。
ただし、プログラム終了後にfree関数で確保した領域を解放するのを忘れずに。
あと、static変数を宣言する手もあるけど。

ちなみに

>void func(int *p,int x){
>p=&x;
>}

だと、func関数を抜けた時点で変数xは消滅するので、消滅した変数xのアドレスを返しても使えない。
685デフォルトの名無しさん:2007/05/30(水) 14:52:47
「プログラム終了後にfree関数で〜」じゃなくて「プログラム終了時にfree関数で〜」でした…
686デフォルトの名無しさん:2007/05/30(水) 15:02:40
>>677
>*←このマークが、これはポインターだよってことを示す印で・・・
「宣言」のときはそうだが、「式」の中では違う。
*(ポインタ) は 「ポインタの中身」。
なので
>>679
>int *p;
>*p=2は正しくて
ポインタを「宣言」して、ポインタの中身を2にしてる。
>int *p=2はエラーになるのは
ポインタ自身に整数は突っ込めないから。

>>685
>プログラム終了時にfree関数で〜
関数を呼び出した元で、その領域が不要になり次第解放すべき。
687デフォルトの名無しさん:2007/05/30(水) 15:16:17
>680
>int *p;
>*p=3;
なんにもわかってねー
688デフォルトの名無しさん:2007/05/30(水) 15:26:09
>>680
もう一度ポインタの勉強をした方がいいね。
あと、自動変数・静的変数の仕組みも。
図にして書くとわかりやすいよ。
689デフォルトの名無しさん:2007/05/30(水) 16:09:55
>680
funcのpとmainのpは別物。
ローカル変数同士同じ名前にしても関係ないのは、ポインタ変数でもかわらない。
690デフォルトの名無しさん:2007/05/30(水) 16:32:54
int* func(){
  int *p = (int*)malloc(4);
  return p;
}

このような関数の戻り値を使うことに問題はありませんよね?
友人に「ローカル変数は関数抜けたら開放されるからどこ指すのかわからなくなる」と言われ混乱しています。
mallocで確保したメモリ領域はfreeするまで開放されないと思うのですが・・・
691デフォルトの名無しさん:2007/05/30(水) 16:40:31
ローカル変数であるpはfuncを抜けたら開放されるが、pが指しているアドレスは開放されない。
pが指しているアドレスを元の関数で受け取っているなら問題ない。
void change(int*,int*);
int main(void){
int x;
int* p;
x=1;
printf("xのアドレスは%p,pのアドレスは%p\n",&x,&p);

//pには&p,p,*pの3つの値がある
//&pは変数pのアドレス
//pはxのアドレスを示すようにすると
//*pはxの値が示される

printf("----------ここから関数呼び出し\n");
change(&p,&x);
printf("xのアドレスは%p\npのアドレスは%p\npの内容は%p\npの内容が示す内容は%d\n",&x,&p,p,*p);
return 0;
}

void change(int* s,int*x){
//関数changeが呼び出されたときにメモリのどっかの領域からsという領域がとられる
//変数sには&s,s,*sの3つの値がある
//&sは変数sのアドレス
//sは代入されたアドレス(main関数の&pの値と同じ)
//*sは代入されたアドレスが示す内容(まだ*pは未定義なのでごみが入っている)
printf("sのアドレスは%p\nsの内容は%p\nsの内容の内容は%p\n",&s,s,*s);
//ここで、&sは関数呼び出しのときに確保されるのでmain関数では使われていない領域を確保
//sがmain関数の&pの値になり、*sがpの内容になる
//よって、main関数のpの値にxのアドレスを入れたいのならpの内容と同等の*sの内容を書き換えて
*s=x;
printf("sの内容をmain関数のxのアドレスと同じ%pにした\n",*s);
printf("------------ここまで関数部分\n");
}
693デフォルトの名無しさん:2007/05/30(水) 16:58:57
>>683
サイズの問題じゃなくて、型が違うからだ。
別に char と int のサイズが同じでも規格上は問題ないんだぜ?
694デフォルトの名無しさん:2007/05/30(水) 18:27:46
int *p;としてポインタ変数を宣言したあと、p にあるint 型の変数のアドレスがすでに代入されていたとする。このint型の変数の内容を100に変更するプログラムをp を用いて記述しなさい。

わかりませぬ・・・・。
695デフォルトの名無しさん:2007/05/30(水) 18:28:57
int *p; としてポインタ変数を宣言したあと、p にあるint 型の変数のアドレスがすでに代入されていたとする。このint型の変数の内容を100に変更するプログラムをp を用いて記述しなさい。

誰か助けてください。
696デフォルトの名無しさん:2007/05/30(水) 18:33:32
*p = 100;
697デフォルトの名無しさん:2007/05/30(水) 18:33:59
なんでこんな唐突にポインタ周りの質問が噴出したんだ?
698デフォルトの名無しさん:2007/05/30(水) 18:34:56
int a, *p = &a;
*p = 100;
699デフォルトの名無しさん:2007/05/30(水) 19:08:53
4月からの授業がポインタまで進んだのかね。
700デフォルトの名無しさん:2007/05/30(水) 19:25:15
Microsoft Visual C++ .NET2003
を使ってみた者なのですが hello would!等 と打ってみたのですが
正常終了しただけで でーんと小ウインドウでhello would! と表示されないのですが
どのように設定したら良いでしょうか???
よろしくお願いします。
701デフォルトの名無しさん:2007/05/30(水) 19:26:14
dとs 間違えました;;
702デフォルトの名無しさん:2007/05/30(水) 19:27:19
>>700
F5で実行したのね。
とりあえずCtrl-F5で。
703デフォルトの名無しさん:2007/05/30(水) 19:27:23
正常に実行されて一瞬で閉じちゃうから
{ char buf[256]; gets(buf); }
とかmainの最後に入れとけ。
704デフォルトの名無しさん:2007/05/30(水) 20:59:27
getchar();でよかろ。
705デフォルトの名無しさん:2007/05/30(水) 22:06:05
皆さんありがとうーーー。
706デフォルトの名無しさん:2007/05/31(木) 13:39:21
変数ってどうやれば出来るんですか?
707デフォルトの名無しさん:2007/05/31(木) 13:40:02
まず、メモリ空間を確保します。
708デフォルトの名無しさん:2007/05/31(木) 13:50:02
恋人ってどうやれば出来るんですか?
709デフォルトの名無しさん:2007/05/31(木) 14:01:13
まず、たくさんの人とコミュニケーションすること。
恋人ができれば、Cまで行くのは簡単だ。
710デフォルトの名無しさん:2007/05/31(木) 20:45:06
いやまあうまい繋ぎだなとは思うんだけどもね
711名無し:2007/05/31(木) 20:57:32
学校のC言語の宿題を聞いてもいいですか?
712デフォルトの名無しさん:2007/05/31(木) 21:00:43
だめです。
713デフォルトの名無しさん:2007/05/31(木) 21:51:44
char型の配列に「AB12C3」って入ってる時
数字だけ消すにはどうすれば……
714デフォルトの名無しさん:2007/05/31(木) 21:57:18
for(i = j = 0; ; i++) {
if(! isdigit(str[i])) {
str[j] = str[i];
j++;
}
if(str[i] == '\0') { break; }
}
715デフォルトの名無しさん:2007/05/31(木) 22:00:48
isdigit の引数を (unsigned char) でキャストするの忘れてた。
ローカルテストじゃやってたというのに。
716デフォルトの名無しさん:2007/05/31(木) 22:08:44
isdigitのパラメータは int じゃないっけか?
それより
for(i = j = 0; str[i] ; i++) {
if(! isdigit(str[i])) {
str[j] = str[i];
j++;
}
}
このほうが、多少シンプルじゃまいか?
717デフォルトの名無しさん:2007/05/31(木) 22:17:32
ヌルターミネートを忘れてないか?
718デフォルトの名無しさん:2007/05/31(木) 22:26:43
>>716
けつに
str[j] = 0;
だな
719デフォルトの名無しさん:2007/05/31(木) 22:26:48
isdigit のパラメータが int だからこそ、
unsigned char へのキャストが必要になる。

for でヌル文字チェックしたら、
for の後に str[j] = '\0'; が必要。
これでもいいとは思うけどね。
720デフォルトの名無しさん:2007/05/31(木) 22:26:59
>>716
intだからこそ問題となることがある。
isdigitに渡す引数がchar型だったとして、その値が負なら符号拡張された値が渡されてしまう。
is系関数が受け取れる引数の値の範囲は0からUCHAR_MAXまでとEOFのみ。
よって、負の値を渡したらまず間違いなく未定義の動作になってしまう。

ASCIIの文字だけしか入っていないなど、char型の値が負でないと確実に言えるのであれば、
unsigned charへキャストしてやる必要はない。
721デフォルトの名無しさん:2007/05/31(木) 22:29:39
宇宙空間並みに密度の濃いスレだなw
722デフォルトの名無しさん:2007/05/31(木) 22:35:28
そういうときは、charをunsignedとして扱うコンパイラオプションを付けて
お茶を濁しておくものだ、って隣のUNIXハカが言ってた。
723デフォルトの名無しさん:2007/06/01(金) 06:54:59
質問です。

char *str[128];

こういう宣言は、128個の文字列のポインタと考えていいのでしょうか?
それとも、char型のポインタが128個あると考えるのでしょうか?

724デフォルトの名無しさん:2007/06/01(金) 07:02:57
>>723
後者です。もちろん文字列の先頭の文字を指すこともできますから、
結果として文字列を指すように使うこともできます。
725デフォルトの名無しさん:2007/06/01(金) 09:05:01
char (*str)[128];
char *(str[128]);
726デフォルトの名無しさん:2007/06/01(金) 11:27:14
>>720
マルチバイト文字列の一部を渡す時点で間違いだと気付こうや。
727デフォルトの名無しさん:2007/06/01(金) 17:57:13
L"GJGJ.txt"

はキャストできるんですが、
char str[8] = "GJGJ.txt";

この変数を、1行目と同様のキャストをするにはどうしたら良いでしょうか?
どなたかよろしくお願いします。
728デフォルトの名無しさん:2007/06/01(金) 18:01:30
>>727
そもそも一行目はキャストじゃありませんが。
729デフォルトの名無しさん:2007/06/01(金) 18:31:18
TCHAR str[8] = _T("GJGJ.txt");

こうしたいのか?
730デフォルトの名無しさん:2007/06/01(金) 18:32:00
って、[8]はだめだろ。コピペしちゃったがw
731デフォルトの名無しさん:2007/06/01(金) 19:01:51
>>730
わざとじゃね?'\0' を入れたくない理由があるんだよ、きっと。知らんけど。
732デフォルトの名無しさん:2007/06/01(金) 19:07:21
\0があるまで走り続けたいんじゃね?
733デフォルトの名無しさん:2007/06/01(金) 19:11:32
C++だとエラーなんだよ。スレ違いだから理由は省略するけど。
734デフォルトの名無しさん:2007/06/01(金) 20:37:53
そんないきなり語りだされても^^
735デフォルトの名無しさん:2007/06/01(金) 21:47:27
>>727
L""はキャストじゃない、クオートの中の文字コードが違う
char str[] = "GJGJ.TXT";
wchar_t wstr[] = L"GJGJ.TXT";

コンパイル時に切り替えるのが_Tマクロ
736デフォルトの名無しさん:2007/06/02(土) 01:11:24
コンパイルに失敗します。
solaris10にvimを入れようとしているのですが
http://music.geocities.jp/antoinettevim/vim71.log
のエラーが出てしまいます。
該当の箇所を見ると
,...となっている部分でした。
http://music.geocities.jp/antoinettevim/intrinsic.h.txt
ヘッダは修正したくないので何か解決方法はありませんでしょうか?
737デフォルトの名無しさん:2007/06/02(土) 01:35:56
Solarisやってればこんなのは普通に会う
インクルードのディレクトリの指定が足りないんじゃないか
738デフォルトの名無しさん:2007/06/02(土) 02:01:36
>>736 がダメなら Solaris の cc だと可変長引数ってどう書くの?
739デフォルトの名無しさん:2007/06/02(土) 02:19:16
http://support.zenwalk.org/index.php?PHPSESSID=84b9cfbdfe961f45c90c7c47960b2268&topic=2134.msg11956

y to add :
#include <X11/Xfuncproto.h>

or :

#if defined(__GNUC__) && (__GNUC__ >= 4)
# define _X_SENTINEL(x) __attribute__ ((__sentinel__(x)))
# define _X_ATTRIBUTE_PRINTF(x,y) __attribute__((__format__(__printf__,x,y)))
#else
# define _X_SENTINEL(x)
# define _X_ATTRIBUTE_PRINTF(x,y)
#endif /* GNUC >= 4 */

in ggtrayicon.h just before line 26 ( the call to gtk-2.0/gdk/gdkx.h)
740736:2007/06/02(土) 03:20:48
>>739
出来ました
上のはだめでしたけど下のでいけました
http://music.geocities.jp/antoinettevim/root.png
ありがとうございます。(バグって事なので結局ヘッダ修正しちゃいました。)

>>737さん、>>738さんもありがとうございました。

なぜかgvimだと日本語表示できないのは
頑張って調べてみます
741デフォルトの名無しさん:2007/06/02(土) 05:23:05
あれ? solaris10なら標準でvimが載ってなかったか?
742デフォルトの名無しさん:2007/06/02(土) 09:14:01
Motifテラナツカシス
743デフォルトの名無しさん:2007/06/02(土) 10:42:22
c言語で実行結果が下のような一定の繰り返しをするカウントアップ
のプログラムを作りたいんですけど誰か教えてください

整数を入力してください:25
1234567890123456789012345
744デフォルトの名無しさん:2007/06/02(土) 10:51:18
土日あるんだからちったぁ考えろ
745デフォルトの名無しさん:2007/06/02(土) 18:00:05
printfやputsなんかの関数が#include <stdio.h>に格納されてるって事?
746デフォルトの名無しさん:2007/06/02(土) 18:21:54
>>743
main(){
int dt;
printf("整数を入力してください:");
scanf("%d",&dt);
if (dt==25) printf("1234567890123456789012345\n");
}
747デフォルトの名無しさん:2007/06/02(土) 18:49:03
>>743
#include <stdio.h>

int main(void)
{
int i, x;

printf("整数を入力してください:");
scanf("%d", &x);

for(i = 1; i <= x; i++) {

printf("%d", i % 10);
}

return(0);
}
748デフォルトの名無しさん:2007/06/02(土) 19:54:09
>>746>>747
ありがとございまーす
749デフォルトの名無しさん:2007/06/02(土) 22:53:08
>>747
氏ね
750デフォルトの名無しさん:2007/06/02(土) 23:03:41
>>749
751デフォルトの名無しさん:2007/06/02(土) 23:05:04
>for(i = 1; i <= x; i++) {
きっとこれが気に入らなかったんだな
752デフォルトの名無しさん:2007/06/02(土) 23:07:50
宿題丸投げに答えたからだよ
753デフォルトの名無しさん:2007/06/03(日) 00:15:35
>>746がセンスの良い(と思ってる)レスをしたのに、マジレスされたおかげで
自分のレスが単なる馬鹿っぽくなったからだろ
754デフォルトの名無しさん:2007/06/03(日) 00:16:27
当てずっぽうに自演認定しても
恥ずかしいだけだよ
755デフォルトの名無しさん:2007/06/03(日) 05:41:54
おまいら>>743をよく読め

>整数を入力してください:25

整数は全角入力なんだよ!
756デフォルトの名無しさん:2007/06/03(日) 05:49:46
な、なんだってーー!!
757デフォルトの名無しさん:2007/06/03(日) 13:12:39
>>743
俺がセンスのいい解答をみせてやるぜ!
758デフォルトの名無しさん:2007/06/03(日) 13:57:17
>>757
はやくぅ
759デフォルトの名無しさん:2007/06/03(日) 13:59:40
760デフォルトの名無しさん:2007/06/03(日) 14:39:05
>>743 イケメンな俺のイカしたソースを見てくれぇ〜〜♪
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int x,y,i,j,lmt;
char *a={"1234567890"},buf[32];
printf("整数を入力してください:");
fgets(buf,sizeof(buf)/sizeof(buf[0]),stdin);
x=atoi(buf);
for(y=x; x>0; x-=10) {
if(x>=10) lmt=10;
else lmt=y%10;
for(j=0; j<lmt; j++)
printf("%c",a[j]);
}
return 0;
}
761デフォルトの名無しさん :2007/06/03(日) 15:35:43
ケチャメンの俺が直したタコなソースを見てくれぇ・・・・
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main(void) {

int x,y,i,j,lmt;
char *a={"1234567890"};
wchar_t buf[32],*p;
setlocale(LC_CTYPE,"jpn");
printf("整数を入力してください:");
fgetws(buf,sizeof(buf),stdin);
x=(int)wcstol(buf,&p,10);
for(y=x; x>0; x-=10) {
if(x>=10) lmt=10;
else lmt=y%10;
for(j=0; j<lmt; j++)
printf("%c",a[j]);
}
return 0;
}
762デフォルトの名無しさん:2007/06/03(日) 16:06:48
>>761
くをっ、こぉのぉ〜!俺のイカソースの一部をパクるんじゃねぇ〜〜!
普通に↓使ってりゃええやろ!w
for(i = 1; i <= x; i++) { printf("%d", i % 10); }
763デフォルトの名無しさん:2007/06/03(日) 16:30:32
>>746
そのプログラムでは実行結果が
「整数を入力してください:25
1234567890123456789012345 」
↑しかできないから不正解じゃね?

764デフォルトの名無しさん:2007/06/03(日) 16:50:15
文字列使うんならもうちょい生かそうぜ
#include <stdio.h>
int main(void)
{
int i, n;
char a[] = "1234567890";
printf("整数を入力してください:");
scanf("%d", &n);
while(n>=10) {
printf(a);
n -= 10;
}
for(i=1; i<=n; i++) putchar(a[i-1]);
return 0;
}
765デフォルトの名無しさん:2007/06/03(日) 17:01:50
俺も書いたぜ
#include <stdio.h>

int main(void)
{
int n;
char str[] = "1234567890";
printf("整数を入力してください:");
scanf("%d", &n);

for(; n>10; n-=10) printf("%s", str);

str[n] = '\0';
printf("%s", str);

return 0;
}
766デフォルトの名無しさん:2007/06/03(日) 17:09:18
>765
センスいいな
767デフォルトの名無しさん:2007/06/03(日) 17:12:39
>>765 イカレタソースを書いた俺もあんたには脱帽したぜ、ベイベー!
768デフォルトの名無しさん :2007/06/03(日) 17:29:42
ちくしょ、>>760のソースから全角入力対応にしたのにみんな全角を無視しやがる。
そんじゃ俺もソースかこっと。
#include <stdio.h>
int main()
{
int c,i;
printf("整数を入力してください :");
scanf("%d",&c);
for(i = 0; i < c; i++)
putchar('0' + i % 10);
return 0;
}
769デフォルトの名無しさん:2007/06/03(日) 17:30:48
>>768
センスねーな
770デフォルトの名無しさん:2007/06/03(日) 17:32:09
>>768 トマトソースを書いた俺もあんたには着帽したぜ、ベイベー!
771デフォルトの名無しさん:2007/06/03(日) 17:34:31
>768
つーか間違ってるぞ
772デフォルトの名無しさん:2007/06/03(日) 17:57:56
なんでこんな唐突にIOCCC?
773デフォルトの名無しさん:2007/06/03(日) 18:06:33
>765の無駄なコピーを割愛。
#include <stdio.h>

int main(void)
{
int n;
static char str[] = "1234567890";
printf("整数を入力してください:");
scanf("%d", &n);

for(; n>10; n-=10) printf("%s", str);

printf("%.*s", n, str);

return 0;
}
774743:2007/06/03(日) 19:01:12
先生にも聞いてみたんですけど下のプログラムを書きかえて
作れって言われました
あと
static char str[]
↑これは習ってないから使わないでやれって言われました

#include <stdio.h>

int main(void)
{
int i, no;
printf("正の整数を入力してください:");
scanf("%d", &no);

for (i = 1; i <= no; i++)
putchar('*');
putchar('\n');

return (0);
}
775デフォルトの名無しさん:2007/06/03(日) 19:08:39
流れ断ち切ってすいません

たとえば
printf("a");
と書くときに

printf("");
を先に書いてしまっているんですが
やはり左から順に書いていったほうが変な癖とかがつかなくていいんでしょうか?
776デフォルトの名無しさん:2007/06/03(日) 19:11:50
#include <stdio.h>

int main(void)
{
int i, no;
printf("正の整数を入力してください:");
scanf("%d", &no);

for (i = 0; i <= no; i++) putchar('0' + i%10);
putchar('\n');

return 0;
}

>>775
そんなことないよ
777775:2007/06/03(日) 19:23:23
>>776
周りに経験者の方などがいないのでどうにも気になってました
ありがとうございます
778デフォルトの名無しさん:2007/06/03(日) 19:41:22
>>775
それやってると、入力効率悪すぎるよ。
カッコの対応が人目で確認できるエディタを使って、順番に書いたほうがメチャ楽。
779デフォルトの名無しさん:2007/06/03(日) 19:55:40
char *get_include_file_name(char *in_str, char *out_str)
{
    char *p = strstr(in_str, "#include <");
    if(!p) return 0;
    strcpy(out_str, p + strlen("#include <"));
    char *q = out_str + strlen(out_str) - 1;
    if(*q != '>') return 0;
    *q = '\0';
    return out_str;
}

in_strが
#include <stdio.h>
という形式なら<>の中を抜き出してout_strに返すというコードなんですが
if in_str =~ /^#include <(.*)>$"/ then return $1 else return nil end
みたいな感じにもっと手っ取り早い表記ってないんですかね。
780デフォルトの名無しさん:2007/06/03(日) 19:57:15
プロトタイプ宣言ってなんですか?
781デフォルトの名無しさん:2007/06/03(日) 19:58:42
そのくらいググれ
782デフォルトの名無しさん:2007/06/03(日) 19:59:26
>>779
一生、高級言語使っていてください。
783デフォルトの名無しさん:2007/06/03(日) 20:05:04
プロトタイプ宣言のない関数の呼び出しがどうのこうのってエラーになった時はどうすればいいんですか?
784デフォルトの名無しさん:2007/06/03(日) 20:07:41
エラーメッセージは勝手に噛み砕かないでコピペしてくれ・・・
785デフォルトの名無しさん:2007/06/03(日) 20:16:10
>>783
自作関数ならプロトタイプ宣言すればいいし、ライブラリとかの関数なら、適切なヘッダーファイルを#includeする。
786デフォルトの名無しさん:2007/06/03(日) 20:27:16
超初心者な質問で申し訳ありません
ある入門本の一番最初なんですが、
#include<stdio.h>

main() {
printf("Hello!");
return 0;
}
でコンパイルすると

「エラー E2209 1: インクルードファイル’stdio.h’をオープンできない
警告 W8065 5:プロトタイプ宣言のない関数’printf’の呼び出し(関数 main)
*** 1 errors in Compile ***」
みたいなかんじでエラーになるんです
なにが原因でしょうか?
787デフォルトの名無しさん:2007/06/03(日) 20:30:08
>>786
環境変数の設定がおかしいと思う。

そのコンパイラの名前と「インストール」とかでググれば、設定の仕方がでてくるんじゃない?
788デフォルトの名無しさん:2007/06/03(日) 21:09:12
>>787
本に書いてあるとおりにやったんで間違いないはずなんですが・・・
ググっていろいろ試してみましたがやっぱりうまくいきません
789デフォルトの名無しさん:2007/06/03(日) 21:19:47
インストーラー付きのコンパイラに変えてみたら?
インストーラーが全部環境設定やってくれるやつ。
790デフォルトの名無しさん:2007/06/03(日) 21:25:21
環境変数の設定以外で考えられる原因ってありますか?
791デフォルトの名無しさん:2007/06/03(日) 21:26:30
>790
答えてもらっておいてその答えが信用できないんなら、もうこないほうがいいよ。
792デフォルトの名無しさん:2007/06/03(日) 21:27:04
もちろんインクルードファイルを何らかの理由で消してしまったとかいう原因も考えられる。
793デフォルトの名無しさん:2007/06/03(日) 21:32:12
>>792
最初からインストールされてないとかも。
単に環境変数とかパスのスペルミスってことも考えられるね。
794デフォルトの名無しさん:2007/06/03(日) 21:32:16
本にはPATHの設定しか書いてなかったんですが、他にもすることあるんですか?
795775:2007/06/03(日) 21:36:02
>>778
両方の意見があるということが聞けただけで参考になりました
とりあえず矯正もしながらやりやすい方法を探っていこうと思います
796デフォルトの名無しさん:2007/06/03(日) 21:36:04
ものによるよ。
797デフォルトの名無しさん:2007/06/03(日) 22:22:43
>>788
君もそのうちわかるようになるさ
本は結構、間違っているとwww
798デフォルトの名無しさん:2007/06/03(日) 22:58:40
書籍だろうがネットだろうが会話だろうが得られる情報に誤謬が含まれていないわけはない
799デフォルトの名無しさん:2007/06/04(月) 02:41:36
環境変数INCLUDE
もしくは、それの代わりの設定(これはコンパイラによる)
INCLUDEが無いんじゃ、LIBもないだろうな
800デフォルトの名無しさん :2007/06/04(月) 06:13:11
>>788
どこのコンパイラかくらい書けっつーの
801デフォルトの名無しさん:2007/06/04(月) 06:32:59
>>800
実はそれを書くだけで的確な回答がもらえるはずなのにね。
802デフォルトの名無しさん:2007/06/04(月) 07:22:17
どなたか
10進数の-5.25を2進数で表示する問題の解き方を教えて頂けないでしょうか
803デフォルトの名無しさん:2007/06/04(月) 07:53:08
n進数は、桁が上がる毎にn倍になる。10進数なら10倍。
同様に、桁が下がる毎に1/nになる。10進数なら1/10。
804デフォルトの名無しさん:2007/06/04(月) 07:59:51
>>802 結構大変な問題だね。 
10進数は小数点以下は2桁で固定? それとも任意?
2進数で小数点以下何桁まで表示すればいいの?
805デフォルトの名無しさん:2007/06/04(月) 08:00:13
>>802
宿題には、もうちょっと条件ついてなかったかい?
ビット数とか、負数の表現方法とか
806デフォルトの名無しさん:2007/06/04(月) 08:04:28
16ビットで浮動小数点を表現する

S(符号)は1ビットで仮数の符号を表す
E(指数部)は4ビットで指数を表し負数は2の補数で表現
M(仮数部)は11ビットで仮数の絶対値を表す

基数は2とする
仮数の0,2進数の少数以下第一位が1になるように、正規化された形で表す
小数点はEとMの位置にする
0の表現はー0と+0の二通りがあり特別に指数部と仮数部をすべて0にする

という問題ないようです
807デフォルトの名無しさん:2007/06/04(月) 08:04:35
>>802
先ずは、5を2進表示する方法を学び、それを小数を扱えるように拡張、更に負数の取り扱いに関して学べばOK。

つーか、2進表現にも色々あるからそれを確認してくれ。
808デフォルトの名無しさん:2007/06/04(月) 08:08:01
>>806
先ず、絶対値を取り扱う。
5.25を2進表現すると101.01(2)になる。
>806の条件に合わせるには0.10101(2)*2^-3となる。
ここまで判れば後は簡単だろう。
809デフォルトの名無しさん:2007/06/04(月) 08:11:35
そのままかけると
0.01262625でいいのでしょうか
810デフォルトの名無しさん:2007/06/04(月) 08:13:16
C言語と関係ない宿題はよそで聞けw
811デフォルトの名無しさん:2007/06/04(月) 08:13:37
ダメだこりゃ〜
812デフォルトの名無しさん:2007/06/04(月) 08:14:32
>808は2^-3じゃなくて2^3だな。
813デフォルトの名無しさん:2007/06/04(月) 08:17:06
>>806 それは >>802の問題?

つまり -5.25 は - 21/4 = S[-1] * M[ 21] * E[ 2^-2] と与えられて
これを2進数で表示すればいいの?

それとも-5.25 という文字列が与えられて この形式に変換するのが課題?
814デフォルトの名無しさん:2007/06/04(月) 08:21:21
>>813
2進数で表示します
815デフォルトの名無しさん:2007/06/04(月) 08:25:14
浮動小数点数の表現を
IEEE 754 なりエクセス 64 なりに仮定していいのであれば、
おもしろいコードを書く事もできるんだけどな。
816デフォルトの名無しさん:2007/06/04(月) 08:27:46
2倍してある値を超えれば 1 、越えなければ 0 。
これを繰り返して、適当なところで小数点や 0 を補えばおk。
817デフォルトの名無しさん:2007/06/04(月) 08:43:45
>>802
つまり課題としては
-5.25 が >>806 の浮動小数点形式で与えられて、
2進数でASCIIで表示すればいいんだね?

S EEEE 1. MMMMMMMMMMM
1 0011 1. 010 1000 0000 = -5.25 =-0b101.01

だから、
1、 0x8000 と AND して1なら'-' を出力
2、 0x0800 or ( 0x7FF and data) が化数
3、  (signed short)(data << 1)>>12 が指数部

2の結果を2進数化して、指数の位置に小数点を打てばいい
818デフォルトの名無しさん:2007/06/04(月) 08:45:34
2の結果は12ビットあるから、2進数化するには、
0x800 とAND しては 0なら0 でなければ1 として 左シフトしてゆくといい。

なお、このスレは宿題スレじゃないので、コードは自分で作ること
819デフォルトの名無しさん:2007/06/04(月) 10:07:47
820デフォルトの名無しさん:2007/06/04(月) 10:16:05
821デフォルトの名無しさん:2007/06/04(月) 10:29:19
NaN の処理の手抜きをやめた
ついでにテストコードを改良
ttp://sund1.sakura.ne.jp/uploader/source/up6179.c
822デフォルトの名無しさん:2007/06/04(月) 13:44:36
>>620
#include <stdlib.h>
int main()
{
return system("sort");
}
823デフォルトの名無しさん:2007/06/04(月) 13:56:32
果たして、そのプログラムの標準入力はリダイレクト可能か?
824デフォルトの名無しさん:2007/06/04(月) 14:04:58
普通、可能だ。
825デフォルトの名無しさん:2007/06/04(月) 14:12:33
ほんまや。できた。
826デフォルトの名無しさん:2007/06/04(月) 14:24:05
system()はコマンドインタプリタを起動するからsystem("ls | sort")、system("dir | sort")のようなこともできる。
#勿論、system("ls | sort > foo")なんてこともできる。
827デフォルトの名無しさん:2007/06/04(月) 14:27:30
そういう意味じゃなくて、
>>822 をコンパイルしてできた実行ファイル a.out に対して
./a.out < test.txt みたいなことができる、という意味。
828デフォルトの名無しさん:2007/06/04(月) 14:32:07
>>827
>824
829デフォルトの名無しさん:2007/06/04(月) 14:33:00
リダイレクトはコマンドインタプリタの機能だと言う理解はないのかな?
830デフォルトの名無しさん:2007/06/04(月) 14:36:16
831デフォルトの名無しさん:2007/06/04(月) 14:38:24
よく分かんないんだけど、
system でシェルを起動した場合、
デフォルトの標準入出力は継承される、
ということになるわけ?
832デフォルトの名無しさん:2007/06/04(月) 14:40:27
紛らわしい言い方になってしまった。

>デフォルトの標準入出力は継承される、
#起動されたシェルのデフォルトの標準入出力は、
#それを起動した側の標準入出力を継承する、
833デフォルトの名無しさん:2007/06/04(月) 14:42:06
一般のOSでは、開いている標準ファイルハンドルはシェルに限らず子プロセスに引き継がれるね。
834822:2007/06/04(月) 15:31:42
>>620の書き込み経緯を汲んでポインタで書いてみました。
freeしていないのはゆるしてw

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct line {
 struct line *next;
 char *data;
} line;
static line *marge(line *a, line *b)
{
 line *top = NULL;
 line **pp = ⊤
 for (;;) {
  if (!a) { *pp = b; break; }
  else if (!b) { *pp = a; break; }
  if (strcmp(a->data, b->data) < 0) {
   *pp = a;
   pp = &a->next;
   a = *pp;
  } else {
   *pp = b;
   pp = &b->next;
   b = *pp;
  }
 }
 return top;
}
835822:2007/06/04(月) 15:32:34
static line *msort(line *x)
{
 line *a, *b, *p;
 if (!x || !x->next)
  return x;
 a = x;
 b = x->next->next;
 while (b) {
  a = a->next;
  b = b->next;
  if (b)
   b = b->next;
 }
 p = a->next;
 a->next = NULL;
 return marge(msort(x), msort(p));
}
836822:2007/06/04(月) 15:34:14
int main()
{
 char buf[1024];
 line *head, *p, **nextp;
 head = NULL;
 nextp = &head;
 while (fgets(buf, sizeof(buf), stdin)) {
  char *eol;
  line *p = malloc(sizeof(line));
  p->next = NULL;
  eol = strrchr(buf, '\n');
  if (eol) *eol = '\0';
  p->data = strdup(buf);
  *nextp = p;
  nextp = &p->next;
 }
 p = msort(head);
 while (p) {
  puts(p->data);
  p = p->next;
 }
 return 0;
}
837822:2007/06/04(月) 15:41:19
s/marge/merge/
orz
838デフォルトの名無しさん:2007/06/04(月) 15:44:27
イ`
839786:2007/06/05(火) 19:18:16
もう一冊別の本を買っていろいろ試してみたらやっとできました
みなさんから見たらなんでもないことかもしれませんがすごくうれしいですね
親切に教えてくれて方どうもありがとうございました
840デフォルトの名無しさん:2007/06/06(水) 08:22:34
FILE *fp;
fp=fopen("FileName","w");


この部分って、fopenが"r"のときはエラー処理入れるけど、wのときはエラー処理いれなくていいの?
何らかの理由でファイルが作成できない場合ってないの?
841デフォルトの名無しさん:2007/06/06(水) 08:23:48
つ[規格票]
842デフォルトの名無しさん:2007/06/06(水) 08:31:03
既に排他的にファイルが開かれているとかでエラーになる事はあるだろう
843デフォルトの名無しさん:2007/06/06(水) 08:33:19
今更だけどFDのライトプロテクトとかの場合はどうなんのかな
844デフォルトの名無しさん:2007/06/06(水) 08:53:08
・ 排他処理により書き込み禁止になっている
・ ディレクトリに書き込み権限がない
・ ディスクフルでそのディレクトリにファイルを追加することすら不可能になっている

こんなところか。
845デフォルトの名無しさん:2007/06/06(水) 08:58:47
>>840
好きにしろ
846デフォルトの名無しさん:2007/06/06(水) 10:44:09
ここが一番初心者向けのCのスレでしょうか?
847デフォルトの名無しさん:2007/06/06(水) 17:41:36
開発環境を整えたいんですが、コンパイラはなにを使うのがおすすめですか?
OSはWINXPです。
848デフォルトの名無しさん:2007/06/06(水) 17:53:34
>>847
コンパイラは cygwin (gcc) 、エディタはTeraPadとかいいんでね?
ぶっちゃけ、好みの問題だからなぁ。
849デフォルトの名無しさん:2007/06/06(水) 17:55:31
目的は?
まあWinならBC++かVC++2005EEがフリーで手に入るので
試しに使ってみるのがいい。

タダで使えるBorland C++ Part5
http://pc11.2ch.net/test/read.cgi/tech/1135127048/
Visual Studio 2005スレ Part21
http://pc11.2ch.net/test/read.cgi/tech/1180692040/
850デフォルトの名無しさん:2007/06/06(水) 17:55:55
>>847
Visual C++ Express Edition 2005 でも落としとけ。
851デフォルトの名無しさん:2007/06/06(水) 18:13:19
>>849
一応、最終的な目標はゲームを作ることです。
>>850
ありがとうございます。
とりあえずVisual C++ Express Edition 2005を試してみようと思います。
852デフォルトの名無しさん:2007/06/06(水) 21:56:13
これからC言語をはじめようと思うのですがどのコンパイラを使えばいいのでしょうか?
OSはVISTAです。できればフリーソフトでダウンロード方法とかも教えてください。
853デフォルトの名無しさん:2007/06/06(水) 22:01:54
ググれカス
854 ◆lIN/ESgxWw :2007/06/06(水) 22:31:40
他の掲示板でも質問したんですが、イマイチ回答が得られなかったんで
コチラに質問させていただきます。


「1本の道に,食べ物が多数落ちている.
ランダムに動く動物が,それらを全て食べ尽くすと終了するようなプログラムを作成せよ.」

<仕様>
[「道」は要素数20程度の1次元配列で表現する.
「食べ物」は,上記配列の各要素に値1があればその場所に存在し,値0であればその場所には存在しないものとする.
「動物」は,1回の移動で配列中の1つ左または1つ右に移動できる.
「動物」の訪れた場所のエサは食べられたものとする.
「道のうち食べ物のない箇所」,「道のうち食べ物のある箇所」,「動物」は,それぞれ -, *, O で表現する.それらを横一列の文字で表示する.
繰り返し処理中は,毎回数十〜数百ミリ秒程度の時間,実行を一時停止させることで,状態の推移を見やすくする.]

といった感じのプログラムなんですが、よろしくお願いします。
ちなみに補足などについては、
・OS:リナックス
・制限など:習ってるのは配列までです。
・コンパイラ:gcc

という具合です。
855デフォルトの名無しさん:2007/06/06(水) 22:33:49
よろしくお願いしますって丸投げかよ
宿題スレへ池
856デフォルトの名無しさん:2007/06/06(水) 23:04:25
for文で〜〜ならば、iaに2を加える
という問題なのですが

ia=ia++1
では2を加えたことにはならないのでしょうか
857デフォルトの名無しさん:2007/06/06(水) 23:08:45
なんでia=ia+2;って素直に書けないの?
858デフォルトの名無しさん:2007/06/06(水) 23:20:51
>856
ia=ia+++1じゃないと式にならん。

>857
中二病なんだろ
859デフォルトの名無しさん:2007/06/06(水) 23:24:06
っていうか処理系依存じゃ?
860デフォルトの名無しさん:2007/06/06(水) 23:30:08
処理系依存?
ia=ia++1が?
861デフォルトの名無しさん:2007/06/06(水) 23:32:56
ちくしょーー、プラスがいっこたらんかったんかー
862デフォルトの名無しさん:2007/06/06(水) 23:40:46
863デフォルトの名無しさん:2007/06/06(水) 23:41:26
>>860
いや正確にはia=ia+++1の方
864デフォルトの名無しさん:2007/06/06(水) 23:46:27
まさかnxtを作っているんじゃあるまいな
865デフォルトの名無しさん:2007/06/07(木) 02:16:53
すみません
以下の文が分かりません。
.nameみたいに.が付いているのは何の意味ですか?

static struct usb_driver hoge_driver = {
.name = HOGE_NAME,
.id_table = hoge_table,
.probe = hoge_probe,
.disconnect = hoge_disconnect,
};
866デフォルトの名無しさん:2007/06/07(木) 05:13:56
>>865
C99で導入された指示付き初期化子と呼ばれるもの。
配列の要素や構造体のメンバを初期化するときに、
要素のインデクスやメンバ名を指定して初期値を与えることができる。
867デフォルトの名無しさん:2007/06/07(木) 07:12:33
a = a++;
が処理系依存なのと同じだな
>>863
868デフォルトの名無しさん:2007/06/07(木) 07:22:48
どうしても素直に書きたくないならia += ++iaかia+=2でも使ってればいいと思うよ
869デフォルトの名無しさん:2007/06/07(木) 08:31:21
>>868
ia += ++ia;
ってどうなるのか説明してください
870デフォルトの名無しさん:2007/06/07(木) 08:54:26
自宅でC言語を勉強したいのですが、ぐぐってもいいコンパイラが見つかりません。

突然で恐縮ですが、初心者でも使いやすいコンパイラを教えて頂きたいです。
871デフォルトの名無しさん:2007/06/07(木) 08:59:28
webの検索欄にきときとって入れてみな
872デフォルトの名無しさん:2007/06/07(木) 09:10:30
>>853
でも、Vista 対応って言うと限られてくるんじゃないの?
ググってもなかなか難しいぞ。
873デフォルトの名無しさん:2007/06/07(木) 09:27:54
>>870
コンパイラなんて使い出せばどれも一緒
使いやすい、だけなら全部お勧め
874デフォルトの名無しさん:2007/06/07(木) 09:28:27
Visual C++ Express使っとけ
875デフォルトの名無しさん:2007/06/07(木) 10:47:18
>>857
ふつう、
ia += 2;
876デフォルトの名無しさん:2007/06/07(木) 10:48:44
>>870
>いいコンパイラ
の基準が何なのか知らないが、やる気がないならやめとけ。
877デフォルトの名無しさん:2007/06/07(木) 10:55:58
for(carry = 2; carry != 0; ) {
 int tmp = ia & carry;
 ia ^= carry;
 carry = tmp << 1;
}
878デフォルトの名無しさん:2007/06/07(木) 11:54:05
Keep It Simple, Stupid!
879デフォルトの名無しさん:2007/06/07(木) 11:57:56
と言うわけで複合代入演算子がベストってことだね☆
880デフォルトの名無しさん:2007/06/07(木) 12:32:01
>>875
>>856が複合代入演算子がふつうに理解できるとは思えない
881デフォルトの名無しさん:2007/06/07(木) 12:33:08
>>854

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
static char way[20];static void initway(void){ int i; for (i =
0; i < sizeof(way); ++i) { way[i] = (rand() >> 4) & 1; } }
static int count_foods(void) { int i; int c = 0; for (i = 0; i <
sizeof(way); ++i) { c += way[i] != 0; } return c; } static void
display(int x) { int i; for (i = 0; i < sizeof(way); ++i) { if
(i == x) { putchar('*'); continue; } putchar(way[i] == 0 ? '-' :
'O'); } putchar('\r'); } static int step(int x) { if ((rand() >>
8) & 1) { if (x > 0) --x; } else { if (x < sizeof(way)-1) ++x; }
return x; } int main(void) { int x = sizeof(way) / 2;
setbuf(stdout, NULL); srand(time(NULL)); initway(); do { x =
step(x); way[x] = 0; usleep(10000); display(x); } while
(count_foods() > 0); putchar('\n'); return 0; }

なかなか食べ終わらないw
882881:2007/06/07(木) 12:55:39
「食べ物」と「動物」の表現が逆になってるな...。
883デフォルトの名無しさん:2007/06/07(木) 13:08:29
881読んでて感じたんだけど、forのインクリメント部を後置(i++)で書く俺は少数派?
884881:2007/06/07(木) 13:12:52
C使いだとそうでもないかな。
C++つかっているとプリインクリメント使う癖が...
885デフォルトの名無しさん:2007/06/07(木) 13:21:30
入門書とかだと後置の方が多くない?
886デフォルトの名無しさん:2007/06/07(木) 13:24:59
C は後置が多い。
C++ は前置が多い。
C++ 使いが C を使うと前置になる事も。

C++ で前置が多い理由は演算子オーバーロードとの関係。
887デフォルトの名無しさん:2007/06/07(木) 13:35:21
じゃあCならループごとに交互に使ったり気分しだいで使い分けても問題ないって事?
888881:2007/06/07(木) 13:40:57
>>887
問題はないけど、どちらかに統一しておくが吉。
889デフォルトの名無しさん:2007/06/07(木) 13:43:10
「C++」 なのに前置が多いとはこれ如何に
890881:2007/06/07(木) 13:43:58
でも、ポインタだと
*(p++) , *(++p) みたいに結果が異なる場合もあるので注意したほうがいい。
891デフォルトの名無しさん:2007/06/07(木) 13:47:50
そういう式は書かないようにする
プログラミングスタイルにしてるし。
892デフォルトの名無しさん:2007/06/07(木) 14:03:55
void f(const int* v, unsigned int num) {
unsigned int i = 0;
while (i < num)
printf("v[%d] = %d\n", i++, *(v++));
return;
}
こういうことか
駄目なスタイルの典型でゴメスだけど
893デフォルトの名無しさん:2007/06/07(木) 16:52:08
*(p++)の括弧嫌いだな・・・
894デフォルトの名無しさん:2007/06/07(木) 16:57:31
優先順位わかってませんって言ってるようなもんだからな。
895デフォルトの名無しさん:2007/06/07(木) 18:02:41
優先順位分かってても、
敢えてカッコ付けることは良くある話。
896デフォルトの名無しさん:2007/06/07(木) 18:20:09
レベルが様々な職業マの現場では、そうですね。
897デフォルトの名無しさん:2007/06/07(木) 18:24:35
a && b || c && d でカッコが要らないの分かってても
敢えて (a && b) || (c && d) と書く俺。
898デフォルトの名無しさん:2007/06/07(木) 18:45:22
>>866
ありがとうございました。
ある構造体に含まれるメンバのうち
特定のメンバだけ明示的に初期化したいときに使うのですね。
899デフォルトの名無しさん:2007/06/07(木) 19:03:42
>>893
>>894
あちゃー、こういう場合は慣用句的に()とっちゃった方が良いんですか><
じゃあ*とインクリメントの組み合わせとかの場合は括弧取って書くようにしますね><
900デフォルトの名無しさん:2007/06/07(木) 19:06:36
そんな事より関数の引数評価の順番に依存する様な書き方を控えた方が

今回の場合問題ないけど
901デフォルトの名無しさん:2007/06/07(木) 19:36:05
問題ないならいいってことじゃ
902デフォルトの名無しさん:2007/06/07(木) 22:21:48
演算子の優先順位なんて覚えてないよ、書くときには。
読むときには思い出す。
903デフォルトの名無しさん:2007/06/07(木) 22:43:34
まあ
a = 3 + (b * 2);
とかじゃなきゃ許す
904デフォルトの名無しさん:2007/06/07(木) 22:56:49
>>899
C言語は、特にポインタ使うととても自由度のある書き方が出来る言語だから
慣用句的な部分は作法として真似ておかないと
互いに互いのコードが読み辛くなるから、 そこらへんは妥協しておいてね。
905デフォルトの名無しさん:2007/06/07(木) 23:04:08
俺は過去コードレビューで
hoge = *p++
はわかりにくいと指摘され
hoge = *p;
p++;
と修正した記憶があるな

個人的にはどっちでもいいだろと思ったけど
万人にわかりやすいのは後者だな
906デフォルトの名無しさん:2007/06/07(木) 23:05:54
Cだったら前者、ポインタと*演算子の組み合わせを括弧なしで表現するはありだと思う。
907デフォルトの名無しさん:2007/06/07(木) 23:08:22
*p++ は慣用句だからまあ分かりにくいことは無いけど、
俺は使わないようにしてる。

というか、インデックス使って書く場合が多い気がするから、
そもそもこういう状況に遭遇すること自体が少ない。
908デフォルトの名無しさん:2007/06/07(木) 23:09:32
プログラムは行数で評価?
909デフォルトの名無しさん:2007/06/07(木) 23:14:36
68000使ってたから、*p++とか馴染みやすかったなぁ。
move.l d0,(a0)+ ; *a0++ = d0

つーか、68000自体がC言語意識した命令セットだから当然なんだけどね。
910デフォルトの名無しさん:2007/06/07(木) 23:16:39
コーディングスタイルスレ逝け
あるのかどうか知らんけどw
911デフォルトの名無しさん:2007/06/07(木) 23:34:01
探してみたが無いみたい。
あってもどーせ宗教論争になってるだろうなw
912デフォルトの名無しさん:2007/06/07(木) 23:53:03
>911
この程度の英語はできるようにしとかないと、変数名とかで困らない?

C/C++ Coding Style Thread
http://pc11.2ch.net/test/read.cgi/tech/1096687703/
913911:2007/06/08(金) 00:02:55
テラハズカシス><;
はい、半角で検索はしませんでした。 orz
914デフォルトの名無しさん:2007/06/08(金) 00:02:57
できるかどうかじゃなくて、
まさかスレタイが英語だとは思わなかっただけでは。
915デフォルトの名無しさん:2007/06/08(金) 08:37:14
実行結果を印刷したいんですがどうやるんですか?
916デフォルトの名無しさん:2007/06/08(金) 08:52:21
>>915
環境が判らんので一般論を。
・実行結果をテキストファイルに出力し、印刷機能のあるエディタか何かに代行印刷してもらう。
・印刷ライブラリ或いは印刷機能を含んだツールキットを使う。
917デフォルトの名無しさん:2007/06/08(金) 08:59:23
myprog > prn
918デフォルトの名無しさん:2007/06/08(金) 10:30:36
>>916
デバッグ開始してこの実行結果を印刷したいんです
919デフォルトの名無しさん:2007/06/08(金) 12:33:34
>>918
デバッガで印刷。
つーか、環境くらい書け、この抜作。
920デフォルトの名無しさん:2007/06/08(金) 12:55:15
./a.out | lpr
921デフォルトの名無しさん:2007/06/08(金) 16:07:08
>・実行結果をテキストファイルに出力し、印刷機能のあるエディタか何かに代行印刷してもらう。
間違っちゃいないが、なんでこうもわかりづらい説明になってしまうんだろうな。コンピュータって
922デフォルトの名無しさん:2007/06/09(土) 03:11:52
> デバッグ開始してこの実行結果を印刷したい
なんて言ってる時点で質問が板違い。
923デフォルトの名無しさん:2007/06/09(土) 13:36:59
Visual StudioのC++で、
wcstoullを使いたいんですが
自前でつくるしかないんですか?

libcのソース参考にすればいいのかな・・・
924デフォルトの名無しさん:2007/06/09(土) 16:49:01
>>923
_wtoi64 はsignedか。unsignedはなさそうな。
http://msdn2.microsoft.com/ja-jp/library/0heszx3w(VS.80).aspx
925923:2007/06/09(土) 18:53:54
>>924
うん、探したけど見当たらなかったから、聞いた

入力を二つに分けて、_wtoi64で数字にして組み合わせとか
いろいろ考えたけど、バグ入ったらいやっだので、
swscanf_s "%llu" 使うことにした。
926デフォルトの名無しさん:2007/06/09(土) 20:01:15
本当にC++ならboost::lexical_castでええやんと思う
927デフォルトの名無しさん:2007/06/09(土) 20:18:05
うっさい禿
928デフォルトの名無しさん:2007/06/11(月) 11:15:02
>>923
_wcstoui64 は VC6 にはないんだっけ?
929デフォルトの名無しさん:2007/06/11(月) 13:37:34
>>928
それなんで>924のページに載ってないんだぜ……
930デフォルトの名無しさん:2007/06/11(月) 15:20:49
別のページにある
http://msdn2.microsoft.com/ja-jp/library/85zk715d(VS.80).aspx
931デフォルトの名無しさん:2007/06/12(火) 21:32:54
添字 0 1 2 3 4
 値 9 4 7 2 5

int型arrayの各要素は表のとおりである。キーボードから要素番号(添字)を読み込むとその要素の値を表示するプログラムを作成しなさい(arrayの各要素の値は初期化で設定)

実行結果例1
要素番号を入力:3
--------------------------
array[3]=2

実行結果例2
要素番号を入力:4
--------------------------
array[4]=5

としたいのですがプログラムを教えてください
932デフォルトの名無しさん:2007/06/12(火) 21:37:41
>>931
課題の解決はこちらへどうぞ。

C/C++の宿題を片付けます 89代目
http://pc11.2ch.net/test/read.cgi/tech/1181087371/
933デフォルトの名無しさん:2007/06/12(火) 21:38:58
>>932
わかりました
934デフォルトの名無しさん:2007/06/19(火) 00:24:19
すみません、以下のようなプログラムを作ったのですが、
mat[0][1]に値を入力すると、エラーが出て終了してしまいます。
何故このような症状が出るのか、
どのようにしたら回避できるのかを教えていただけませんか?



#include<stdio.h>

int main(void)
{
int n = 3;
double mat[3][3];
int i, j;

for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
scanf("%f", mat[i][j]);
}
}

return 0;
}
935デフォルトの名無しさん:2007/06/19(火) 00:31:59
scanfに変数を渡す時はアドレス渡し
今のプログラムだと入力されたmat[i][j]の値が示すアドレス(不定)に代入され望む結果にならない、というか落ちる
mat[i][j]に代入するならmat[i][j]に示すアドレス&mat[i][j]をscanfに渡してやるべし
936デフォルトの名無しさん:2007/06/19(火) 00:35:53
>>934
scanf("%f", mat[i][j]);

scanf("%lf", &mat[i][j]);
     ~~ ~~
937934:2007/06/19(火) 00:38:04
>>935
やってみたら、ちゃんと入力できました!
しかし、matの各要素が、0.000000になってしまいます。
値が渡されていないのでしょうか…。
よろしければ再度教えていただけませんか?
938934:2007/06/19(火) 00:39:47
>>935
>>936
失礼しました!
更新押さずに書き込みをしてしまい、>>936さんのレスを読んでいませんでした。
>>936さんの仰るとおりにやってみますと、正常に動きました!

お二方、本当にありがとうございました!
939デフォルトの名無しさん:2007/06/19(火) 01:54:50
デデッ!これで人に言われるまで気づかない新人の出来上がりデスゥ〜♪
940デフォルトの名無しさん:2007/06/20(水) 01:51:40
>>939
心の貧しい人だなぁ
(´・ω・)かわいそうに…
941デフォルトの名無しさん:2007/06/20(水) 02:59:43
人に言われても気づかない、もしくは気づいていても認めないヤツよりはよっぽど上等だが。
942デフォルトの名無しさん:2007/06/23(土) 13:58:13
>>937
教科書くらいは一冊もっていたほうがいいよ。
943デフォルトの名無しさん:2007/06/24(日) 17:30:02
0除算時の動作は未定義。よって、どんな動作をしても規格上問題ない。
プログラムがランタイムエラーになっても、演算結果が0になっても、そこで無限ループに陥ってもOK。
http://www.st.rim.or.jp/~phinloda/cqa/cqa7.html

宿題スレよりこっちのほうがいいと思う。
C言語なら俺に聞け(入門篇) Part 14
http://pc11.2ch.net/test/read.cgi/tech/1181735298/
くだすれC言語(初心者用) Part.2
http://pc11.2ch.net/test/read.cgi/tech/1172099763/
944デフォルトの名無しさん:2007/06/24(日) 17:38:44
思いっきり誤爆したorz
945デフォルトの名無しさん:2007/06/24(日) 17:53:00
自動配線ツールをCで書こうと思ってるんですけど。
アルゴリズムはmazeをベースで。

書くときに参考になるソースコードとかってどっかに落ちてるものなんでしょうか?
アルゴリズム分かっても、書くのが素人なので、どれ位の規模(行数)になるかとか、必要な関数が予想つきません。
おおよその規模とか分かる方がいれば教えてください。お願いします。
サンプルなどがあればと思って質問させていただきました。
946デフォルトの名無しさん:2007/06/24(日) 17:58:24
>>945
どこまでマルチする気ですか・・・

自動配線て巡回セールスマン問題とか最短経路問題とかの類?
アルゴリズムのmazeってのがわからんのだが、参考になるようなサイトある?
947デフォルトの名無しさん:2007/06/24(日) 18:16:30
どこに行って聞いても「スレ違い」と言われるので、いろんな所に聞いていこうと思ったんです。
お騒がせしてすいませんでした。

繋ぐ2点の座標と障害物の座標を与えて、その間の経路を求めるプログラムです。
アルゴリズムはそれほど気にしなくて良いです。

あまり知られていないようですね。ご迷惑をおかけしました、失礼します。
948デフォルトの名無しさん:2007/06/24(日) 22:04:34
ロケールの文字コード取得するのってsetlocale()の返値使うしかないのでしょうか
949デフォルトの名無しさん:2007/06/25(月) 00:45:23
>947
まず「アルゴリズム 経路探索」で検索して
引っかかったページで解り易そうだと思ったとこ全部読め。

ある程度読んだら、迷路の各マスをノードと考えて解け。以上。



それと…

> どこに行って聞いても「スレ違い」と言われるので、いろんな所に聞いていこうと思ったんです。

C言語ならここでも構わんし、言語問わないなら「スレ立てるまでもない」スレとか。
活発なスレでスレ違いにならなさそうなスレ探して1つ書けばいいと思う。

いくつものスレに質問して回るのは嫌がられるぞ。俺も嫌いだ。
巡回してるスレで2つも3つも同じ質問見かけたら答える気なくす。
…答えてるけどな。
950デフォルトの名無しさん:2007/06/25(月) 00:46:28
って自動配線、だから普通にノードでいいのか。
mazeってあるから勘違いした。
951デフォルトの名無しさん:2007/06/25(月) 00:50:04
落ちてるソースコードで何とかしようという魂胆が気に食わない。
952947:2007/06/25(月) 11:04:21
>>949
ありがとうございます。
一つ目書いてスレ違いだったんです。
それは明らかに自分の勘違いだったので、
改めてC言語のスレに書き込んだのですが、やはりスレ違いと言われて。
回答もらえそうな適当なスレ探せないなら、迷惑なだけなので、もうそこで諦めないといけませんでした。
本当にすみませんでした。
953デフォルトの名無しさん:2007/06/25(月) 11:37:59
>>951
かしこいやつは、落ちてるカリントウですら利用する。
負け組みは毎日デスマやってろw
954デフォルトの名無しさん:2007/06/25(月) 13:35:15
かしこいやつは床にこぼれているご主人様の白濁液さえありがたく舐め取るというわけだ
955デフォルトの名無しさん:2007/06/25(月) 17:25:24
>>953
よく見ろー!それ犬のうんこー!
956デフォルトの名無しさん:2007/06/26(火) 17:54:33
巡回セールスマン問題をあちこちのスレに聞いて回る
巡回マルチポスト問題児
957デフォルトの名無しさん:2007/06/29(金) 21:49:43
dllファイルを機能同じで、サイズを大きくするにはどうすれば良いでしょうか。
958デフォルトの名無しさん:2007/06/29(金) 21:54:38
俺は不要なバイナリデータを埋め込む事で数百MBytesのDLLを作った
959デフォルトの名無しさん:2007/06/29(金) 21:58:37
尻にゴミつければいいだけじゃん
960デフォルトの名無しさん:2007/06/30(土) 02:18:54
copy small.dll+huge.bin -b > huge.dll
961デフォルトの名無しさん:2007/07/03(火) 06:27:04
char *str;
fgets(str,100,stdin);

これを実行して
abcde
と入力してエンターを押したら
strには
abcde\n\0
これが入ってるの?
962デフォルトの名無しさん :2007/07/03(火) 09:07:50
>>961
入らないよ
963デフォルトの名無しさん:2007/07/03(火) 09:23:19
領域確保してないポインタに文字列突っ込もうとする奴はいつになってもいなくならんな。
964デフォルトの名無しさん:2007/07/03(火) 09:40:05
これがすぐ近くだからいいけど、離れたら原因不明のバグにw
965デフォルトの名無しさん:2007/07/03(火) 15:32:54
>>964
運良く動いてしまう恐さ
966デフォルトの名無しさん:2007/07/03(火) 15:41:21
セキュリティホール満載
967デフォルトの名無しさん:2007/07/03(火) 18:55:18
VCのデバッグビルドなら0xccccccccでAccess Violationだな。
968デフォルトの名無しさん:2007/07/03(火) 18:58:29
フフフフ
969デフォルトの名無しさん:2007/07/04(水) 09:28:27
あるある
970デフォルトの名無しさん:2007/07/04(水) 10:26:11
アセンブリ(?)みたいに直接メモリいじれたほうが楽そうだな
971デフォルトの名無しさん:2007/07/04(水) 20:30:26
strtokの関数のman読んだら
>これらの関数は絶対に使用しないこと。
と書かれてるんだけど、その理由がイマイチわからない。
誰かこの詳しい理由を教えていただけ無いでしょうか?
972デフォルトの名無しさん:2007/07/04(水) 20:52:36
その下に何か書いてないのか?
973デフォルトの名無しさん:2007/07/04(水) 21:05:30
>これらの関数は絶対に使用しないこと。使用する場合は、以下の点に注意すること。
>  これらの関数はその最初の引数を変更する。
>  これらの関数は const な文字列では使えない。
>  区切り文字自体は失われてしまう。
>  strtok() 関数は文字列の解析に静的バッファを用いるので、スレッドセーフでない。これが問題になる場合は strtok_r() を用いること。

いや、これは、バグと言うか、strtokの仕様であって、
気をつけるも何も、これを理解して使うはずだろうし。

他に理由があるのかなって。
974デフォルトの名無しさん:2007/07/04(水) 21:12:09
ウンコ仕様だから、あんまり使ってくれるなってことだろ
975デフォルトの名無しさん :2007/07/04(水) 21:21:02
>>971
別に絶対使ったら駄目な関数なんてない
strtokの場合、使い方にクセがある、それとスレッド間の問題
976デフォルトの名無しさん:2007/07/04(水) 21:26:13
同スレッドだって2つ以上同時にトークン分割できないし
977デフォルトの名無しさん:2007/07/04(水) 21:38:21
この程度の関数なら、自分で作ればいくらでも安全にできるね。
978デフォルトの名無しさん:2007/07/04(水) 22:07:58
過去の互換性のために残してあるだけの関数といえるのかもしれない
979デフォルトの名無しさん:2007/07/04(水) 23:29:14
getsみたいな。
980デフォルトの名無しさん:2007/07/05(木) 01:07:33
Cの標準関数は今となっては危なっかしいのが多いな。
BCPL系言語はもう死滅したほうがいいのかもしれない
981デフォルトの名無しさん:2007/07/05(木) 04:56:04
C++ 使えば改善してるよ。
982デフォルトの名無しさん:2007/07/05(木) 20:48:18
>>980
ライブラリの不備と言語仕様をごっちゃにすんなよ・・・
983デフォルトの名無しさん:2007/07/05(木) 20:56:45
その言語仕様の尻拭いをするだけのものを作ろうと思っても、
C++ のより使いやすいものは作れんな。
984デフォルトの名無しさん:2007/07/06(金) 06:56:43
#include <stdio.h>

main()
{
int a;
int b=0;

for(a=0; a<=100; a++)
printf("セ氏温度:%d カ氏温度:%d\n",a ,fahrenheit(a,b));
}

int fahrenheit(int x, int y)
{
y = (9/5)*x+32;
return y;
}

セ氏温度からカ氏温度を求めるプログラムなんですが
カ氏温度をfloat型にして小数点以下も出力したいのですが
エラーばかり起きて困ってます
誰かfloat型にください
985デフォルトの名無しさん:2007/07/06(金) 07:38:08
>>984
関数と言うものを勉強しなおして、プロトタイプ宣言も勉強することをお勧めしておきます。
986デフォルトの名無しさん:2007/07/06(金) 08:19:17
>>985
それでできてたらここには来てません
987デフォルトの名無しさん:2007/07/06(金) 08:29:58
>>986
勉強する気がないなら、お帰りください。
少なくともどういうコードを書いたらどういうエラーが出たのか、
それさえ説明できないようなら人間やめるといいと思います。
988デフォルトの名無しさん:2007/07/06(金) 08:35:05
float a=0;main(){int a;for(a=0; a<=100; a++)
printf("セ氏温度:%d カ氏温度:%f\n",a ,fahrenheit());
}float fahrenheit(){return 9*a/5+++32;}

実行結果はfloatになった
989デフォルトの名無しさん:2007/07/11(水) 02:27:13
家でボーランド導入したんですが作ったプログラムってどこにおくんでしょうか?
bcc32 「このプログラム」
マイドキュメントにおいているんですができません。
http://www.wakayama-u.ac.jp/~miw/ip3/HomeBCC+SDL/homebcc.html
一応このサイトどおりにはやりました。
990デフォルトの名無しさん:2007/07/11(水) 02:30:54
>>989
何ができないの?
991デフォルトの名無しさん:2007/07/11(水) 02:37:44
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
エラー E2194: ファイル 'a.c' が見つからない
ってでるんです。場所のおき方が悪かったのかなと思って。
マイドキュメントにおいたんですけど。
992デフォルトの名無しさん:2007/07/11(水) 02:39:15
ファイルを置いた場所にあわせてカレントディレクトリを移動するんだ
993デフォルトの名無しさん:2007/07/11(水) 02:43:22
マイドキュメントに設定されてるって聞いたんですけど間違いでしょうか?違うなら
Q1、最初どこに設定されているんですか?
Q2、cd のあとどう書けばマイドキュメントに移動できるんでしょうか?
994デフォルトの名無しさん:2007/07/11(水) 02:47:12
C:\Documents and Settings\UserName>
コマンドプロンプト起動時にこうなっていれば
C:\Documents and Settings\UserName>cd "My Documents"
cdコマンドでマイドキュメントに移動して
C:\Documents and Settings\UserName\My Documents>
コンパイルしよう
C:\Documents and Settings\UserName\My Documents>bcc32 a.c

ディレクトリ名にスペースがあればダブルクォーテーションで囲む
995デフォルトの名無しさん:2007/07/11(水) 02:57:33
ドキュメントに移ったんですが、ファイルが見つからないってなります。プロパティは
・名前 a.c
・ファイルの種類 cファイル
・プログラム notepad
あとOSがXPなんですがこのままで大丈夫でしょうか?
馬鹿ですみません
996デフォルトの名無しさん:2007/07/11(水) 03:05:36
わかりました。名前が違っていたらしいです。
a.c としていたんですが
a とやったら上手くいきました
ありがとうございました。
997デフォルトの名無しさん:2007/07/12(木) 10:46:34
a.c → コンパイル → a.obj → リンク → a.exe
a.exeを実行するのは、aとだけ打てばいい。 a.exe と打ってもいいけど。
998デフォルトの名無しさん:2007/07/13(金) 00:46:07
>>989
全部読んだらなんかムカついてきた。
埋めついでに言ってやる。
「お前は、a.cというC言語ソースファイルをコンパイルしたa.exeを実行したかったんだ!」
だから
「a.cが実行できません」とでも書けば、もっとすんなりアドバイスできたんだよ!
「できません」じゃわからんつーの!!!まず主語を書け!!!
999デフォルトの名無しさん:2007/07/13(金) 00:49:17
         ,ヘー―-、_
        / ,、--―-、 、ノ
        l  / ヽl\Nヽl
        |6 l   ◎. .◎l |
        l, d、  A ノ/
        />→ー-‐爪
       / / [= ∞ =] |、
     / /  [= ハ =] l、
    /  /|__[= l l =] 、_\
   /ミ (| l\_) ̄ ̄〈 \_)
   ヾミミ/l、/      :l
    __) /lミl        l
  (,―´ └┬┬‐┬┬┘
  .   ( (  ト┤  ト┤
1000デフォルトの名無しさん:2007/07/13(金) 00:49:48
      ,ヘ- ―-/l
     / , --―- 、ヽ.
     l6/ノレ'l/ヘ ll 6l
     l l ◎. .◎ Vlb l      デェェェェーー
       ll   A   ノノ、
      r`=ー‐--=´'ー、; 、
      / [=' ∞ =]    l \
    /  [= ハ  =] i   ヽ \
   /__, [=_ i i _=]  l\ /\\
  (  _ノ L  ̄    l  \__) \
  .  ̄  /l       lー、     ) ∧
      /          l イ\  / /)
      〈           〉イ  レ' / /
      ヽ_ _ ____ノ l/  \/ イ
       l__l   l__l   `    \(
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。