1 :
デフォルトの名無しさん :
2007/02/22(木) 08:16:03
2 :
デフォルトの名無しさん :2007/02/22(木) 08:37:42
2get
3 :
デフォルトの名無しさん :2007/02/22(木) 10:10:06
裏切派遣って知ってる? 元々は正社員だったのに取引先にフリーのほうが稼げるとか騙されて派遣やってるバカのことw 前の会社を裏切り、結局派遣先からも騙されてる。 そもそも信頼されてるなら直接契約するか正社員にするはずだが、派遣会社経由って舐められ杉 自分でも騙され裏切れられてることは薄々わかってるから派遣問題の話が出るとウッキー!って逆ギレw
4 :
デフォルトの名無しさん :2007/02/22(木) 17:06:10
保守
printfってなんですか?
関数の名前です
半分は優しさでできています。
D.リッチーのやさしさが詰まってます。
9 :
デフォルトの名無しさん :2007/02/24(土) 11:52:39
doubleが数値であるかないか、つまりNaNやinfではないかどうかはどのように判定すればよいのでしょうか?
fpclassify
>>9 Double.isNaN
Double.isInfinity
13 :
デフォルトの名無しさん :2007/02/24(土) 15:10:31
最近思うのだが C言語のreturn文てあまり使わないんじゃないの?
?????
最近思うのだが
>>13 は
C言語の関数をひとつしか作らないんじゃないの?
このへんはC99? isnan,isinifnite
17 :
デフォルトの名無しさん :2007/02/24(土) 15:22:14
引き数をポインターにして戻せば良いかなと思うんだけど
>>16 isnanはC99要求だね。
isinifniteってのはないが、isinfがC99から
fpclassifyもだけど
>>17 hoge( hage() ) みたいに、結果をそのまま他の関数に渡す場合は?
関数なんて便利なものがなかった時代でもプログラマはなんとかやってたわけだからreturn使わなくてもなんとかなるだろ。
なんとかならないから関数の概念が発達したんだろうに。
time()みたいに引き数でも戻り値でも戻す奴もいるがな。
関数を呼ぶときに必ず右辺値を要求されるのは鬱陶しくてかなわん。
>23 どゆこと?kwsk
左辺値を要求されると即値が書けずに鬱陶しいという話なら分かるが、 右だとなんだろ。
28 :
デフォルトの名無しさん :2007/02/24(土) 22:34:02
printf()系の関数ってどうやって、 複数の型で値渡ししてるの? int printf(const char *format, ...); ...っていうのが可変長引数っていうのまでは わかったんだけど・・・ 個人的予測では、void*で受けて、 *formatの内容で型キャストしてるのかなぁ・・・と。
va_stratとかでググれ。 どうやっているかはコンパイラ次第でどうにでもできるようマクロで隠されている。
30 :
28 :2007/02/24(土) 22:44:04
>>29 そうすると、いろいろやり方があるって事ですか?
例えばでいいので教えてもらえませんか。
可変長引数を受け取る方法は、 29の言うva_startなど<stdarg.h>にある一連のマクロを使うことになっている。 コンパイラは、可変長引数をどうやって実現していようと、 <stdarg.h>の内容を定められたとおりに実装しなければならない。 だから結局使う側は<stdarg.h>のマクロの使い方を知っていれば良く、 どうやって実現されているかということは知る必要など無い。 もちろん理解を深めるために知りたいとかそういう話は別だ。
32 :
28 :2007/02/24(土) 23:03:42
>>31 >>29 さんはva_startの事を言っていたんですね。
stdarg.hを参照することにします。
有難うございました。
でもって、可変長だと、実際に引数がいくつ、またどんな型で渡されたかは、 C言語的には判断できないので、printfのように%指定で判断する(だから%指 定の数やデータ型と引数にズレがあるとおかしなことになる)約束にするか、 型情報とデータをペアで交互に渡し、最後の引数として特定の値(NULLとか)の ものを積むとか決めておく。
質問失礼します。 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もかなりの量を使っているので、削除できるものがあれば削除したいのですが。
35 :
28 :2007/02/25(日) 21:44:12
>>28 です。
詰まったので、又質問させていただきます。
stdarg.h内にてva_startを参照したところ__builtin_va_startに対して
マクロ定義されていたました。
__builtin_va_startとは、一体何者なのでしょうか・・・
検索したのですが、解説しているページがなく困っています。
よろしくお願いいたします。
va_startマクロが何をラップしていようと知ったこっちゃない。 コンパイラの開発元にでも問い合わせとけ
37 :
28 :2007/02/25(日) 21:50:29
>>28 va_arg が何をやってるかを低レベルで理解したいってこと?
関数の引数はスタックに積まれるので
最初の引数のポインタを渡すことで
それ以降の引数のアドレスを求めているだけ。
取り出すときは型情報を指定することでサイズがわかる。
stdarg.h 使わずに実装すると勉強になりますよ。
>>38 どうもありがとうございます。
これですっきりします。
用例1は未だしも、用例2はカス以下だな。
>>42 >用例1は未だしも
そう思った、お前もカス以下だな。
後のWM_(NC)CREATEのCREATESTRUCTを見ると、 WindowsのCreateWindow(Ex)はおそらく用例2を使っている。 だからどうしたということだが。
45 :
デフォルトの名無しさん :2007/02/27(火) 21:56:35
よくポインタでつまずく、ポインタが難しいといわれてるけど、 ポインタ以前で難しいところやつまずきやすい所はどこ?
環境設定
パスを通すところだな 初心者がマニュアル読まず検索せず過去ログを読まずに 質問してくる
しかも質問にはエラーを貼らないとか省略するとか独自解釈するとか。
49 :
デフォルトの名無しさん :2007/03/03(土) 13:14:32
Cの勉強を始めるに当たり、参考書を買おうと思ってるのですが、 どれがいいのか教えていただけないでしょうか?
51 :
デフォルトの名無しさん :2007/03/05(月) 09:50:01
週明け早々お聞きしたいのですが 配列で、効率的にメモリ確保をしたいのですが、どうやればいいでしょうか。 具体的には ・・・・・・・・・・・・・・・ ・・・・・・・・・・・ ・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・v こういう座標群があったとして、それを配列に確保していきたいのです。 point[x][y]のように宣言して、左上から値がなかったら0 あったら1のように確保していくと 無い部分のメモリが無駄に取られてしまうので 座標がある部分だけ、確保したいのです。 図は二次元ですが、それを3次元でやりたくて、そこで詰まっています。 ご指南お願い致します
すいません、上げてしまって。 他のスレの方が聞けそうなので、こちらの質問は撤回させていただきます。 すみませんでした
53 :
デフォルトの名無しさん :2007/03/13(火) 15:13:44
strcatを使用しないでchar型配列(str1とstr2)を連結したいのですが、 文字列str1の最後の'\0'に文字列str2の0からを一つずつ代入していけばいいのは 分かるのですが、やり方がわかりません。 どうすればできますか?
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 さん
ありがとうございます。
まだポインタのほうを勉強していないのでまだよく分からないのですが、
参考にしてみます。
配列の知識のみで書くと、 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で割っていけばできるような気がするんですが、イマイチわかりません。
桁数 = 1 + log10(N) 高校数学の知識だろ。
中学生かも知れないじゃん。 int val = 7743; int keta = 0; int temp = val; for (; temp > 0; keta++, temp /= 10); ただし val > 0 のときのみ
61 :
58 :2007/03/15(木) 01:18:03
62 :
デフォルトの名無しさん :2007/03/16(金) 22:14:48
while(*p++ = *q++); どうしてこれで文字列がコピーできるんですか。
最後の¥0を含めて文字をコピーしてはポインタが進み、 ¥0を代入したところで式全体の値が¥0つまり整数としては0になり、 偽と見なされるのでループが終了する。
64 :
62 :2007/03/16(金) 22:39:36
早速ありがとうございます。 もうちょっと教えてください。 カッコの中の「左++」「代入」「右++」では、必ず真ん中の「代入」から走るってことでいいですか? 左右の++が同期取れてないとずれちゃうんじゃないの、 ていうのが一番疑問なところなのです。
++が後置されているときは、まず現在値を以降の式で 使うものとして控えてから1を加える。 前置なら1加えるのが先。
>62って書き換えると do {  *p = *q;  p++;  q++; }while(*p); ってことなんだよね。 初めて見たとき while(*p) {  *p = *q;  p++;  q++; } かと思ってなんで'\0'がコピーされるのかしばらく理解できなかったよ。
シムラーセミコロンセミコロン
>67 上のdoはwhile(*(p-1))じゃないと。
寧ろどちらかというと while (p[0] = q[0], p++, q++, p[-1] != '\0') ; だな。
#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で代用しちゃだめ?
>>71 駄目じゃあないけど、
プログラムが正常終了したときに0を返し、
異常終了したときに0以外を返すのが慣習なので、
特段の理由がないときは慣習に従っておくのが得策。
プログラムを呼び出すプログラムでは、呼び出して返ってきたときに そのreturnの値を参考にするようになってることがある。 呼び出したプログラムが成功裏に動いたときに限って後続の処理を行うとか。 練習で作るようなプログラムでは実質的にはどんな数を返してもいい。
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@ のように最後にまったく関係のない文字が表示されてしまいます。その理由と解決策を教えてもらえないでしょうか?
str2に'\0'を入れ忘れているからじゃないか?
printfの直前に *q = '¥0';
77 :
74 :2007/03/18(日) 02:17:01
>>75-76 回答ありがとうございます!解決しました。
なんともないように見えることもあるみたいですが、\0が抜けているとこういった不具合が起こるんですね。
自分で決めた位置に¥0を入れないと、「運良く」その先に¥0が入っている ところが見つかるまでずーーーーっと文字列が続いていることになってしまう。
整数は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型では文字列が扱えないのか理解できません。
> a=getchar(); getcharはEOFも返すのでint型を返すと宣言されており、実は正解。 EOFの場合を弾いてからchar型として扱うべき > printf("%c\n",a); 可変個引数では全てint以上に拡張されて引数が渡される規則。 char型の値を渡そうとint型の値を渡そうと正常に動いてしまう。 > int a[50]="Hello"; できないという規則になっているからとしか言えない。 int型の配列に文字列を無理やり入れる方法はあるが、 文字列を扱う関数はchar配列、つまりsizeof (char) == 1バイトずつ 文字がメモリに格納されることを前提にコードが書かれているので、 無理にint型の配列にしたところで、正しく動作しない。
>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) ; とすれば実装できなくは無いな。
int a[50] = {'H', 'e', 'l', 'l', 'o', '\0'}; でいいじゃない
>>80-82 ありがとうございます
char a[50]="Hello"; と char a[50]={'H','e','l','l','o','\0'};
は違うのでしょうか?
手持ちの本では、特に違いは書いてないのですが・・・
"Hello" は char[] 型 {'H','e','l','l','o','\0'} は文脈によって char[] とも int[] とも解釈できる。
"hello"のような文字列リテラルはchar配列を初期化するのに使える (その場合{'H', 'e', 'l', 'l', 'o', '\0'}のように解釈する) という規則が特別に設けられている。 だからint a[50] = "Hello";はできない。 でもwchar_tがintとなっている環境なら、int a[50] = L"Hello";でいけるはず。 率直にwchar_t使えと言うとこだが。
>>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型として扱うべき
とありますが、どんな風にするんですか?
文字列をintで扱うって言っても、ライブラリ関係を全部自作しないといけないよ。
まあ試しに
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 です。
解決しました。
もう大丈夫です。失礼しました。
課題でislowerを使わない(islowerのプログラムを自作する)というものが出たのですが、 どこから手を付けたら良いかさっぱり分かりません。 ヒントで良いので教えていただけませんか?
1.文字がアルファベットの小文字かどうか判定する 2.小文字だったら大文字に変換する
>>92 さんありがとうございます。
ヒントを手がかりにしてやってみます。
その素直なとこに免じてさらにヒントだ。 1.文字は数字で表され、aからzは順番に数字が割り当てられている。 2.大文字と小文字の差は一定。
>>91 です。
ありがとうございます。
ASCIIコードの大文字と小文字の差を利用すれば良いんですね。
だんだん分かってきました。
ありがとうございます。
遅くなりましたが
>>91 です。
お陰でislower出来ました。
isupperのプログラムも真似してやってみたら出来ました。
>>92 >>94 さん、親切に教えてくれてありがとうございました。
プログラミングの学習過程上では「そんなこともある」程度の認識でもOK な雑談: C言語はアスキーコードでない、アルファベットの並びが素直じゃない文字 セットで動くことを認めているので、アスキーを仮定するのは行儀が悪いと 言えば悪い。また、英語以外では大文字小文字の規則が少々複雑なこともあ り、単純な引き算では片付けられないこともある。
GetWindowTextで取得した文字列を他のプロセスにペーストするには どうしたらいいでしょうか
WM_SETTEXT メッセージを直接送ったら良かったと思う。
WM_SETTEXTがまずいならWM_COPYDATAという手も。 それで間に合わないならプロセス間通信
>>99 >>100 ありがとうございます。
自分、ズブズブの素人なもので、なかなか上手くいきませんが
調べまくって頑張りますです。
例えば、data1に{2,4,22,5,3}とデータが初期化されていて、 data2にdata1のデータを小さい順に並び替えるにはどうすれば良いでしょうか? sortはまだ習っていないので、数値を比較して、 小さかった順にdata2に代入していくという方法でやっていきたいのですが。
自分が思う方法でやってごらん カードとか用意して自分で手作業で並べかえてみてその方法をプログラムにしてみる
一番小さいカードを選んで先頭に置いて、二番目に小さいカードを選んで二番目に置いて、以下同様に。
>>103-104 ありがとうございます。
そのまま代入していく形になるんですね。
本当に初心者なものですみません。
#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ばっかでウザいとは思う。
>>102 >数値を比較して、小さかった順にdata2に代入していくという方法。
これも立派な既知のソートアルゴリズムだ。Selection sort。
#include <"ファイル名"> このファイル名の部分についての質問です。 このファイル名は、大文字、小文字を区別してないみたいですが、 これって、仕様なんですか? 初歩的な質問ですが、よろしくお願いします。
FATファイルシステム、MS-DOS、Windows(特にWindows NTのWin32サブシステム)などの仕様
>>109 なるほど、仕様なんですね。
安心しました。
回答ありがとうございました。
Macも、UNIXベースなくせにデフォルトインストールでは区別しないから Macで動いてるRubyスクリプトを他所に持って行ってハマったことがある。
>>111 NTFSは区別するよ。
Windowsの標準ファイルシステムドライバがFATとの互換性を維持するために、
大文字小文字の違いしかないファイルを同一視してるだけ。
SFUインストールすればオプションでCaseSensitiveな環境も構築できる。
#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
>>114 コンパイラの環境設定に失敗しています。コンパイラの添付資料をよく読んで設定しなおしてみてください。
エディットボックスに入力された文字列を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の文字列は表示出来ています。 よろしければご教示願います。
クリップボードにセットするデータはメモリへのハンドルでないといけないので、 固定メモリでは駄目、LMEM_MOVEABLEにしないといけない。
HLOCAL clipbuffer = LocalAlloc(LMEM_MOVEABLE, size); こうなるのでしょうか。 んんん、上手く行かない
メモリへのハンドルに対しては直接読み書きできない。 LocalLockを呼んでハンドルからメモリへのポインタを取得する必要がある。 そしてアンロックすると再びハンドルが利用可能になる。
120 :
116 :2007/03/21(水) 10:17:17
SetClipboardData(CF_UNICODETEXT,clipbuffer); とすることでなんらかのデータがクリップボードにセットされました ペーストしてもなにも追加されませんが。 プログラミング初めて2日目なもんでまだ全然理解出来てないです。 勉強してきます。
SetClipboardDataでググれば色々サンプルが見付かると思う。
つかいい加減スレタイ嫁
別に環境依存ネタ禁止ではないしいいんじゃないのそれくらい
124 :
116 :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と読み取れてしまう。 なぜ?
>>125 fgets(&ch[i],20,fp);
はどういう動作をする?
127 :
デフォルトの名無しさん :2007/03/21(水) 13:39:55
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言語習ったばっかなんだけど、 こういう事プログラミングでできないかな?って思ってます。シミュレーション をするのに最適な言語って何ですか?
シミュレートの計算・方法が分かるならば余裕で出来る。
可能かどうかはアルゴリズムに因るわけだが その辺の記述が全く無いので何もいえない たとえば理想的な放物線をシミュレートするのは難しいができる事、 でも貴方の人生をシミュレートするのは出来ないこと(出来るかも?) 二つの違いはシミュレートするためのアルゴリズムの違いに因る
>>129 気温シミュレーションは、別にC言語を使わずともできる。
>>129 曲線を分析するならCで十分だろう。
気象シミュレーターみたいなものが作りたいなら、
Cでもできるが、そういう計算に最適化された言語もある。
ウィンドウの長さとかテキストで簡単に編集できるようにしたいんですが 形式は何がいいんでしょうか?iniとかcfgとかdefとか
好きなのでいいよ
設定ファイルの拡張子ってことか? 俺はユーザーに書き換えられても問題ないデータは.iniを使ってる。
139 :
129 :2007/03/21(水) 18:19:32
意見、ありがとう。 気温か待機電力のシミュレーションをしようか迷ってます。 まぁ卒論だからもっと練らないとだめだろうけどね! 待機電力量を出す計算の仕方はわかるから、それを何十年後は どうなるか?っていうのはシミュレーションできる?実際は 将来、待機電力量を少なくする装置なんかも現在開発されてて シミュレーションとは違う結果になるんだろうけど、その違いを 説明していくのも面白いと思ってます
140 :
135 :2007/03/21(水) 18:30:17
>>140 ふつうのユーザが弄れるようにするなら
デフォルトで関連付けられてるiniかtxtがいんでね?
すまんWindowsならの話だなこれは
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); } みたいに一つにまとめるにはどうしたらいいですか?
||
145 :
143 :2007/03/23(金) 17:26:14
>>144 ありがとうございます。
if (wParam == VK_LEFT || wParam == VK_RIGHT){
MessageBox(NULL, "message", "title", 0);
}
でいけました。
I でもいけたんですが、 I と II はどう違うんですか?
| はビット演算の or || は論理演算の or 全然違う
二度実行したら特定の動作をさせるってのはなんとなく出来そうなんですが、 三度実行したらまた別の動作をさせる、っていうのは可能でしょうか?
よくわからんがカウンタを持って実行する度にインクリメント
実行ってのが関数呼び出しのことなら関数内に static で呼び出し回数を 数える変数をおいとけばよろし。
exe自体の実行回数で判別したいのです いろいろ試行錯誤してますがどーもうまくいかず。。
Windowsならレジストリに書くとか。 exeの実行回数となると、それなりの排他制御(同時に2つ起動したらどうなる?) しなきゃならんのでご注意を。
なるほど、単体で済まさずに外部で記録するなり制御させれば良さそうですね。 もうしばらく試行錯誤してみます。
単純な処理を考えるのにフローチャートをよく使うんですが Cプログラミング言語診断室では「goto文と並ぶ諸悪の根源」とかいわれて不安になりました ノート1ページに収まるような小規模なものでもやっぱりやばいんですかねぇ?
べつにヤバくはないけど、プログラミングは絶対に上達しないと思うよ。
診断室なんか読まなくていい。今となっては古すぎる内容だし、 かといって書かれた当時は良かったのかというとそうでもない。 超初心者を叩く初心者が書いた本。 まあ、フローチャートはオススメしないけど。
フローチャートって効率悪くね?
158 :
154 :2007/03/23(金) 23:23:25
診断室の信憑性とは関係なしに駄目ということですか ならやっぱり図とか使わずにいきなりコードに書いて簡単なメモ取りながら試行錯誤する方がいいんでしょうか? それとも無理やり頭の中で全部やっちゃう癖をつける方がいいんでしょうか?
なれない内はメモにちょこっと書く分にはいいでしょ やってるとわかるだろうけど、ちょっと処理が複雑になると フローチャートなんて書いていられなくなる
データフローお勧め
ロジックよりも、きっちりとデータ構造を決める方がずっと重要だよ。
162 :
154 :2007/03/23(金) 23:51:29
データフローに関して調べてるうちにアクティビティ図というのを見つけました
メモがよく怪文書になるのでこういう定型的な書式を使ってまとめていく方針でいこうと思います
ありがとうございました
>>161 今まではそのデータ構造を決めるのに流れ図を使ってました
流れ図で書いてうまくかけない場合はその原因を踏まえて構造を見直す・・・といった具合にです
よく考えなくても滅茶苦茶効率悪いですがほかにいい方法を知らなくてです
よし。ifとgotoしか制御構文のない擬似プログラミング言語でどんどん書くぜい。
それも算術ifな
また懐かしいものをw
俺これからC言語始めようと思うんだが、「速習C言語入門」っていう本で大丈夫かな? 他のプログラムの知識はほぼ皆無で、これが最初ってことなんだけど。
やりたい事が思いつかないなら課題と回答が沢山乗ってるやつ やりたい事があるなら、 入門書なんかかわずにネット上で公開されてるC言語講座で十分です
>>168 おk、やりたい事って特に無いからボリュームのあるやつ探すわ。
ボリュームを求めるのは挫折者の典型例
柴田本に汁
Cだけなら大丈夫 いきなりwindowsプログラミング、さらにMFCとかじゃなければ (VisualC++はこれで挫折者を大量生産した) いきなりC++からやっても大丈夫だと思う
柴田望洋の本なんか薦めるなよ
>>170-173 いろんな意見あって結局どうするか迷ってきたw
時間は十分にあるんだがなぁ。
入門レベルならネットで十分だと思うよ
確かに何もわからないままVC買ってMFCアプリを選んで 出てきた自動生成コードを見て「なんじゃこりゃ?わけわかんね」と挫折する人いそうだ。 なまじ経済力がある大人ならなおさら。
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言語を初めて、ファイル入出力の勉強をしています。 実行時にテキストファイル名を入力し、そのファイルの内容を表示させるプログラムを 作りたいのですが、セグメンテーション違反と言われます。 どこがおかしいのでしょうか・・?
"argv[i]" はargv[i] の間違い? あと、 argv[argc] はNULLになるからね。 i <= argc は i < argc で
あとエラーにはならなかったと思うけど argv[0] は実行したファイル名が入るからね。
>>177 >178でも>179でもないけど更に言うなら、fgets()したものをそのまま捨てているので、
そのままでは最後のファイルの最後の行のみがファイル数分表示されることになってしまう。
ファイルもクローズしていないし、ファイル入出力の基本を復習しましょう。
#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したものを使えるようになったのでしょうか?
まだつっこむとこいっぱいあるんだけど、 せめて、どの行で落ちたのかくらい自分でわかるようになってくれ デバッガ使ってないんなら、せめて何行目までは動作したのか、 落ちたときの原因となる変数の中身は何なのか。 printf だけでもなんとかなるべ
x[j] != EOF で何を判定したつもり?
>>182 申し訳ありません。おっしゃる通りです。勉強してきます・・
>>183 ファイルの最後の行を判定したつもりです。
>>184 1ファイルだけのプログラムもできないのに複数ファイルをいきなり扱おうとするのが大間違い。
そのロジックで本当に、ファイルの最後の行が判定できると思う? なんで? どこかに書いてあった? 思い込んでない?
>>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;
}
本当はfopenとかを呼んだ時もエラーを返していないかチェックしないとあかんよ
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]); }
ところで自分が書いたプログラムがどう動作するのか確かめるにはどうすればいいですか?
コンパイルしてデバッガ使って走らせる
>>190 即レス有難う。
次元の低い質問してすみませんでした。
動作するかどうかの確認にはテストツールを使うんじゃないか? テストに失敗したときにはデバッガが役に立つ。
どのように動作するか、だった。 デバッガがある環境でその扱いに慣れてるならデバッガでステップ実行だね。
なるほどSEHは必要だな、と思った。
C99で追加されたインライン展開 これって実行速度が多少早くなる可能性がある、ってだけ?
オーバーヘッドを気にして見難くするよりはインライン使ってすっきりさせろってことだろ
#defineの関数形式のマクロよりは引数・戻り値に型がある分だけ 少しは型安全になっているという感じ。
実はgcc/icc辺りだとstaticな関数は積極的にインライン展開するからinlineキーワードは使わない罠。
cl.exeならどうか?
イインダヨー
フリーでC言語学習に使えそうなエディタとコンパイラ紹介してくれ。
VisualC++ 2005
それ以外でオネ
VisualC++ 2005EE
サービスパック1だから使用不可 それ系統以外でオネ
BCC
SP2を当てられない理由は?
フリーじゃないから。
はい?んなあほな
割れXP使っててうpデートが出来ないんだろうが
SP2はセキュリティ面で結構変更されたからSP1で動いてもSP2で動かないものもあるんよ。 MSがどんな変更を加えても追従できる筋のいいソフトばかりの世の中じゃないから。 そういうのは置き換えてはいってるがなかなか進まねえ。
勉強目的ならcygwin+gccでいいじゃん 軽くうにっくすにも触れるし一石二鳥。
癖がありすぎるから学習用にCygwinはお勧めできない。 あれはよくわかっているやつ向けだ。 coLinuxの方がいいよ。
癖がありすぎるから学習用にcoLinuxはお勧めできない。 あれはよくわかっているやつ向けだ。 Debianの方がいいよ。
癖がありすぎるから学習用にDebianはお勧めできない。 あれはよくわかっているやつ向けだ。 Vineの方がいいよ。
癖がありすぎるから学習用にVineはお勧めできない。 あれはよくわかっているやつ向けだ。 Mac OS Xの方がいいよ。
癖がありすぎるから学習用にMac OS Xはお勧めできない。 あれはよくわかっているやつ向けだ。 FedoraCoreの方がいいよ。
なんでもいいからひとつに決めてくれよ…
じゃあC言語
MinGW gcc Cygwinよりも癖があるような気がしないでもない。
C言語の学習目的だけならMinGWいらないと思うんだが。
紙とペンさえあれば学習は出来るわな
実際に動く環境がないと、効率よくないだろ。
やっぱvisual c++っしょ? 初心者でも使えるデバッガとか付いてるし 無料だしMS謹製だし
BCCで十分
初心者入門にVC++は罠過ぎるだろ 日本語でおkなヘルプに専門用語バリバリだから最初触ったとき意味不明だった記憶がある。 どっかのサイトみながらコマンドラインコンパイラいじってた方がよほど分かりやすかった。
どのレベルの初心者かによる
UML書きながら考える程度の初心者です
せめて脳内でまとめてから図表にしようね
まとめるための道具が図表だろうが。 それでまとまったら清書だろうが。
図形の問題を考える時に適当な図とか描くけど UMLもあぁいうような使い方出来んの?
使う人次第としか
リナックスの鯖借りてログインして使えば良いのでは?
何の話かしらんが、借りるまでもなく自分で作ればいいだろ
236 :
デフォルトの名無しさん :2007/04/22(日) 14:25:30
floatは必ずdoubleの半分なのでしょうか?
いいえ。
精度が倍であるのは確定ですよね?
いいえ float以上であれば十分 もちろんfloatにもdoubleにも最低限の精度の規定はあるが
float ≦ double ≦ long double という規定だから、 float = double でも(両方とも最低精度をクリアしているなら)問題ない。 例えば、float = double で両方 64 ビットとか。
>>238 厳密には精度は仮数部のbit長
IEEE754なら一意にきまるが, そうでなければ実装依存
IEEE754以前は機種依存, 互換性求めて古いフォーマットを使用可能にしている
処理系も結構ある.
エクセス64もあるよね。
243 :
デフォルトの名無しさん :2007/04/29(日) 18:43:03
mallocを失敗させたいのですがどうすればよいでしょうか?
>>243 実行中にmallocによるメモリ操作時期において、なんかPCを粉々にする呪文を唱えて粉々にする
いやならOSのメモリ割り当ての部分を粉々にする
それも嫌ならメモリをガンガンmalloc()で予約しまくる
ってかラップする
while(malloc(1));
>>244 >>245 リモートの共有サーバでテストしているので大量のメモリ確保はできません。
ラップというはどうやるのでしょうか?
static void *malloc(size_t size) { return 0; }
今、Windowsプログラミング(Win32API)を勉強中です。 それで、疑問ですが、ウインドウプロシージャはコールバック関数である ということで CALLBACKという識別子が関数名の前につくのですが、 どのC言語の入門本にもこの識別子の解説がありません。 この識別子はマイクとソフトが自社製OS用の開発言語に仕様として作った ANSI−Cとは無関係のものでしょうか?
…というか、<windows.h> の中で #define CALLBACK __stdcall としてあるだけ
処理系定義なものだから、ANSI-Cは関係ないな。たしかに。
ウィンドウズプログラミングって時点で処理系依存って理解できないのか。 他の処理系使う機会とか無いのだろうな。哀れだ。
>>243 malloc(0x7FFFFFFF); を失敗するまで実行。
253 :
デフォルトの名無しさん :2007/05/04(金) 05:36:50
>>252 メモリ管理もまともにできない糞OSであるLinuxなら失敗しててもずっと非NULL値を返すよ。
失敗している場合はそのメモリにアクセスした途端に強制終了させられるらしい。もう、アホかと。
>>253 妄想乙。
簡単にできるんだから実験してから物を言おうねw
>突然あるプロセスが削除されるのが望ましくない状況で使用されていて、しかもカーネルのバージョンが十分に最近のものであれば、このメモリを割り当て過ぎる動作 (overcommitting behavior) を以下のコマンドで無効にできる。
> malloc() が NULL でない値を返しても、そのメモリが実際に利用可能であることが保証されない。 失敗しても非NULLを返すとは書いてないな。
>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と出力されることはないよな。
犬厨必至杉でワロタw
怖すぎて実行する気になれない
>>260 窓厨必死だなwwwワロス
>>261 別にちゃんときれいに死んでくれるから大丈夫だよ。もちろんmalloc failedと出力されて。
殺さずにmallocに失敗させる方法ないかな? 窓なら例えば他のプロセスが使用しているメモリにアクセスするとかして
>>262 環境依存ネタなのに、大丈夫だと言い張る馬鹿発見。
>>264 いや、
>>259 の方法でも殺してはいない。ただmallocに失敗してるだけ。
「きれいに死んでくれる」の書きかたがまずかったな。
malloc失敗してNULLが返ってるだけだよー
malloc(0xffffffff)とかすれば失敗するでしょ。
窓でもmallocで別プロセスの使用しているメモリにアクセスすることは出来ないと思うよ。
窓だとVirtualAllocEx -> WriteProcessMemory とかでアクセスするんじゃなかった?
0xffffffffでできたー!! Releaseじゃないとデバッガが勝手に殺してくれちゃって出来なかったけど C++のbad_allocもおんなじようにすればいいのね
bad_allocなら自分で投げろよw
何でC言語出来るようになったのか教えて欲しい・・・
目的の動作をするプログラムを書いたから、かな
大量にコードを書いたからだな。
kernelより先にメモリ確保すればいくらでも好きなだけ使えると思うが。 つ 仮想化
274 :
デフォルトの名無しさん :2007/05/08(火) 02:58:23
なんか意味もなくvisualstudio2005買ってプログラム作ろうとしてるんだけど、 どのファイルを開けばいいんすか? webとかwindowsインターフェースとかいろいろあってわからんですよ
VSスレいけ
そんくらいググれよ
とあるソースをポーティングしててのことなんだけどさ、 int hogehoge(size_t length) { if (length < 0 || length > sizeof (fooo)) { ; } } ↑みたいなソースで、 「length < 0は、unsigned だから0以下で評価することはありえね〜」ってな感じの英文の警告がでるのだけど 無意味だから消す? まんどくせ〜からシカト? signed にキャスト? おまんらならどうするよ?
シカト
↑対策案、もいっこあった。 コンパイルオプションで警告をOFFる
その警告は実害ないから消しても別に良さそうだな。
俺だったら、そこまでやる暇がない限りlength < 0を消す
万が一を考えて消さない方がいいと思うけどな。
>>282 万が一とは、コンパイラのバグのことか?(w
警告はウザイのでsignedにキャストして消す。 後で他の重要な警告がくだらない警告でまぎれて見えずらくなるのが嫌なので。
signed にキャストしたら絶対ダメだぞ! それで負になるかもしれないわけだし。
みなさん速レスサンクス
やぱ、十人十色っぽくなるかなぁ・・・・
もうね、最近C言語扱うってなったら、昔(10年ぐらい前)のソース(もちILP32)を
用件定義は、「昔と同じ機能で動けばいいよ」だけみたいな感じで、
いくら安いハードでも今時だから64bitだびょーんで動かすとなると・・・
迷うこと多いね・・・
ILP32互換オプションはデフォとしても(所詮昔の機能仕様程度だから2Goverのデータ扱うことないし)
>>284 他の重要な警告を見落とすリスクは脳裏をよぎった
>>285 真意。2G(ILP32と仮定して)超えるデータはありえね〜仕様だよなとか脳裏をよぎりつつ・・
>>281 暇(工数)考えると、よけいな修正してデグレてもあふぉらしいしなとか・・
まぁ、規模とか警告とかの件数によるので、値増し交渉のネタとか考えてみます。ありがとう
警告ぐらいは何らかのフィルタかければいいだけだろう。
>>286 そのコードを自分がどう扱わなければならないかで対応を変える。
自分がメンテナンスする羽目になるのなら、(問題がないか確認した上で)length < 0を消す。
管理は他人が行なうのなら、放置した上で「消えない(消さない)警告一覧」にリストアップしておく。
呼び出すほうに hogehoge((size_t)-1) が無い事が確認できれば消すかな、おれなら。 でも、もしかしたら最上位ビットが立ってる場合、特別なナニカがあるのかもしれない・・・
hogehoge の引数を、何らかの諸般の事情で size_t から int 等に変えるような状況が発生しえないのなら length < 0 は消しても問題ないと思う。
>>289 そのためのssize_tなのにcastして無視したら意味無いよね
constのパラメータをソッコーcastしたりとか・・意味ね〜
まぁ、腐臭のするソースなら、size_tもtime_tもssize_tも全部intだったりありがちだよね。
それでもbugらずに動いてたり(まぁ昔は大丈夫だったりするのかもしんないけど)
おれならさっさと length<0を消して、 消した理由をコミットログに残してリポジトリにコミットだな。
今のC言語の仕様に合ったソースに書き直す方向で、ってのは、ほぼ一致した意見ということで。
以上、自演でした。
一人だけ何を話していたか理解できなかった人がいたようでw
質問です。 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; } ならすぐ思いつくのですが、これでは答えを満たしていません。 どうすれば良いでしょうか?
>>296 そこまで考えたのなら後一歩。
if () {
...;
} else if () {
...;
} else if () {
...;
} else {
...;
}
あ、わかった。 continue;つかえば良いんだ。 トンです。
読んでみたが、「この問題に再帰を使え」なんて書いてないぞ。 16進も使わずに書けるだろ?
変態的な関数言語を除いては ループで出来ることを再帰に直す問題より 再帰で簡単に出来るのを何とか可読性を保ちながらループに直す って問題の方が遥かに多いと思うんですが、そうでもないんでしょうか?
自前でスタック管理をすれば、再帰からループに直すのはすぐだな。
>>296 乗り遅れ感バリバリだけど3と5は互いに素なんだから
else入れる必要ない、というより入れない方がいい。
最後のは assert にしたらいいかな。
なんでこんなに馬鹿がわいているんだろう……
#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回出てくるのですが、何がいけないのでしょうか。 見苦しいコードですが、よろしくお願いします。
>>308 getchar()が喰い残した改行文字が入力されるため。
つーか、121だとか書かずに'y'と書きなさい。
#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); }
>>309-310 早速のレスありがとうございます。
>getchar()が喰い残した改行文字が入力されるため。
このあたり、まだ理解が足りないようなので勉強しなおしてみます。
>つーか、121だとか書かずに'y'と書きなさい。
なんとっ!
一冊の本だけをあてにするものではないですね。。
その本の名前は?
>>311 int ch;
while((ch = getchar()) != EOF) printf("%d[%c]\n", ch, ch);
これを実行してみれ。
>>314 さすがに end != 121は少々ヤヴァイね。ワロタwwwwww。
また望洋か・・・
>>315 だからそこのページはダメだって。
まぁ、
>入力終了の改行も改行コード(\r)として入力に入っちゃうから
こんな嘘書くくらいだからお似合いかも知れんが。
>>315 そのページは、空白を含む文字列を読み込むにはscanf()の代わりにgets()を使えなんて書いているから論外だ。
>>314 よくもまあそんな堂々とでたらめを書けるもんだな。
え、嘘なのか? 俺も同じように習ったんだがどこが嘘なんだ?
>>320 どこが出鱈目?
まぁ確かに明解C言語入門編が有名かといわれると些か疑問ではあるが。
return(0); って括弧で括るやつがやたらたくさんいるのは なぜかと不思議に思ってたんだが、こういうふうに書いてる本があるんだな。
returnが関数だと誤解してる人を育成してる。
>>322 ん?本の内容がでたらめだって話じゃねえの?
初心者向けに端折ったりするとああなる。 後で他の本を読んで誤解が解ける事を見越して書いてるんだろう。
なんだ、本の内容か。それなら著者を見た時点で出鱈目なのは自明じゃないか。
int i(0)も駄目でしょうか?
ここはCのスレです。
331 :
デフォルトの名無しさん :2007/05/12(土) 20:36:57
C言語初心者です。 javaは少しやったことあります。 最初にコンパイラとか環境作りをすると思うのですが、 その場合は、雑誌など買って付いてくるROMを使うのでしょうか? 初歩的な質問ですいません(;´Д`)
つVC2005Express
雑誌についてくるような物はネットでも公開してることが多いから 最近は検索してダウンロードが多いね。 自分も332と同じくVisualC++ 2005 Express Editionがお勧め。
>>323 昔は本当にreturnにも括弧が必要だったという事情もある
今でもやたらたくさん要ることの説明にはならないかもしれないが
K&R一版には括弧付いてたっけ
>>334 > 昔は本当にreturnにも括弧が必要だった
それって都市伝説じゃないのか?
>>335 付いてた
Cが開発中の時は、 returnが関数だったのかも知れないって
説もあったけど真相は不明。
情報を拾おうにも、どう検索していいものやらだな・・・。
>>337 呼び出し元の関数でスタックをどれだけ使ったかわからないのに、
呼び出し先で戻り先がわかるものなのかな。
>>339 Pascalチックな作りだったんじゃね?
ライオンズ本を見てみたが、return (式); という書き方を使っているな。
>>340 Pascalちっくというと積んだパラメータをスタックから取り除くのは、
呼び出し側の責任てだけだよね。
それ以外にもauto変数もスタックを使うわけだし、
やっぱりreturnが関数だったとして戻るところがわかるとは思えないな。
どうやっていたんだろう。というか都市伝説の一種だろうね。
本当に関数だったのではなく、構文上関数の形式を取っていただけなのかもしれん。 コンパイラが特別に配慮するとかして対処。 まあ、そうすることの意義とか利点が分からんので多分違うと思うけど。
switchとかと同じなんじゃないの?
345 :
デフォルトの名無しさん :2007/05/13(日) 17:22:28
無料のコンパイラをダウンロードし、入門書を見ながらやっているのですが、 #include <stdio.h> main () { printf("C programming"); printf("日本語もOK?"); return 0; } これをファイルに保存し実行したら、メモ帳が開き↑のが出てきてました。 何が悪いのですか?
>>345 頭。
ファイルをダブルクリックでアプリケーションを探してもらうのではなく、
アプリケーションからファイルを開くことも覚えておいた方がいい。
コマンドラインでソースコードのファイル名を指定したのかも?
>>345 そもそもPCの知識なしにプログラムなんてできるわけがないよ
入門書にコンパイルの方法って載ってないの?
コマンドラインで test.c ってな感じにやったのなら根本的に間違い。 .cのソースファイルをコンパイラでコンパイルし、 出来たexeファイルとかを実行する
>>345 C 入門の入門読んでるでしょ。全項目飛ばさずに読みなよ。
もしかしたら「C言語エディタの使い方〜入門編〜」とかだったりしてなw
BCC Developer使ってるんですけど、一つのプロジェクトには一つのexeしか作れないんですか? 例えば、testというプロジェクトにtest01.cとtest02.cを入れて、メイク→実行とやっても、先に作ったtest01.cの結果しか表示されません。
たぶん1プロジェクトに1exeファイル。 bcc32 test01.c test02.c みたいになってると思う
>>354 わかりました。ありがとうございました。
他の関数で配列を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; }
やたらと「配列」という単語が出てきてる日本語の質問だけど、 プログラムソース読むとTEST型の大きさのメモリ領域の確保と解放してるだけなんだが?
mallocは実行時に確保した領域のポインタとサイズを"どこかに記録"してある。 freeをする時は引数とその記録から解放する領域の範囲がわかる。
> TEST *t = (TEST *) malloc(sizeof(TEST) * 10); ここで配列使ってるぉ (^ω^
配列ではない
配列じゃないよね
(^ω^ どこがちがうのかぉ?
364 :
356 :2007/05/14(月) 00:20:42
mallocは配列でなくて、callocを使えば配列になるんでしょうか。 下のfreeはmallocでもcallocでも確保したものは全部解放してくれる と考えていいんですね。ありがとうございます。
366 :
356 :2007/05/14(月) 00:43:05
なるほどありがとうございます。 ・配列というのはローカル変数でしか扱えない ・引数、戻り値は全部ポインタ変数 という考えでいいですか。
>365 そのページは痛いな
んじゃもっとましのを貼っといて。
>>366 どこにもそんな事は書いてないだろ・・・
>365 バブルソートのソース面白すぎ。
どこが面白い? 普通じゃん。
マジでやばいw
>>365 たとえば
>[]の役割は、配列の要素番号を指定する演算子なのですが
>その仕組みは、単に、配列名というアドレスに足し算を行っているだけです。
配列とポインタの違いについて解説しているのに、これはないだろう。
添字演算子は配列にもポインタにも使えるって事なのに。
バブルソートは普通、内側のループは1回づつ減っていくだろ。
>>374 int a[5] = { 0, 1, 2, 3, 4 };
printf("%d\n", *(a + 3));
>>376 なにがいいたい?
その[]は演算子ではないし、p[n]と*(p+n)が交換可能なのは、配列とポインタの違いとは関係ない。
そもそも「配列とポインタの違い」を解説するなんて どこにも書いてない訳だが。
「配列とポインタの奇妙な関係」が配列とポインタの違いを解説していなかったら、いったいなにを解説するんだろう?
配列とポインタの類似点とか
そもそも実行時には配列なんて概念が無くなるとか なくなっちゃって困る場面があるから構造体にまとめてプチリフレクションにしてるとか
383 :
デフォルトの名無しさん :2007/05/14(月) 07:52:03
文字列です
文字列へのポインタの配列です。
なんで { } で囲んでるのかは理解できないけど文字列。
解りやすいように書いてあるだけで、実は1つの文字列です。
388 :
デフォルトの名無しさん :2007/05/14(月) 09:17:39
gccで、sleep(time)にすると秒単位しか指定できないようなのですが、 ミリセカンド単位(0.5秒とか)でスリープさせるにはどうしたらよいのでしょうか。 教えてエロイひと
man したら usleep とか nanosleep とかでてきたけど
>>389 環境依存。sleep()は一般的に、秒単位で寝る関数。
sleep()が使える環境なら、大抵はUnix系だろうからusleep()かnanosleep()が使えるはず。
但し、精度に関してはミリ秒以下しかないので要注意。
cygwinなど、Win環境でgccを使っているのなら、APIのSleep()を使うのも一つの選択。
392 :
389 :2007/05/14(月) 10:45:21
393 :
デフォルトの名無しさん :2007/05/14(月) 15:58:29
#include<windows.h> 〜〜〜 で、コンパイルしたら、「インクルード ファイルを開けません。'windows.h'」 って出ました。これって、どこで手に入れるものなんですか?無料でDL出来るんですか??教えてくださいm(__)m
Express Edition かな。 PlatformSDK ってのがフリーで落とせる。 詳細はググれ。
>>393 includeやlibのPATHが設定されてないとか
>>393 PlatformSDKを落として
libのパスを通すための詳細を誰かがどっかのページに
載っけてるからググれ
Visual Studio 2005ならWindows SDKのほうが便利。 スタートメニューにそこらへんの設定を自動で行ってくれるツールへのショートカットが入っている。
398 :
デフォルトの名無しさん :2007/05/14(月) 21:44:44
連結リストを逆順につなぐreverse関数を作成したいのですが、 アルゴリズムが分かりません。どなたか教えていただけませんか?
>>398 >連結リストを逆順につなぐreverse関数を作成したいのですが、
>アルゴリズムが分かりません。どなたか教えていただけませんか?
double linked list を使え。
400 :
デフォルトの名無しさん :2007/05/14(月) 21:53:10
>399 双方向リストは使用しないで、やりたいです。 単方向だけでやる方法を教えてください。
スタックを用意すれば?
絵を描いて考えればわかると思うよ 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だけでできますか?
比較的最近、この板のどっかで初心者がそういう関数のソースの解説を求めてたから、 真面目に解説した記憶があるよ。探してご覧。
今、自分のノートPCにFreeBSDをインストールしてCプログラムをコンパイル&実行したりしています。 それで友達がVisual Studioのほうがいいよと言います。 大学のPCにはVisual Studioが入っているのですが重くてどうも好きになれません。 その点、FreeBSD(UNIX系)のほうが軽いしコンパイル作業等、本当にプログラミングしてる感じが好きです。 将来はプログラマーを目指しているのですがVisual Studioのほうがいいのでしょうか?
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
>>405 好きなほうでいいよ
どっちもやってみればいいじゃない
>>405 仕事になれば決められた開発環境をつかわなならんこともあるだろう。
そのときに適応できればなんでもいいよ。
>>405 今、FreeBSDでのプログラミングが楽しいんならそれでいいんでない?
コマンドラインツールに慣れてれば、後々いろいろと応用が利くしね
統合環境から入るとコマンドラインツールに触れる機会あんまりないだろうし
410 :
デフォルトの名無しさん :2007/05/14(月) 23:50:49
>406 ありがとうございました!できました。
ああ、俺いつまでたっても、リストが苦手だ・・・ よっし!いいかげんリストは丸暗記してしまうくらいソースを書いて練習しまくろ。 いつまでたっても中途半端な自分に嫌気がさしてきた。 C#どころじゃねーよ。 プログラミングの勉強初めて3年足らずでC→JAVA→C++→C# なにやってんだ俺!ばかじゃねえの。中途半端もくそ食らえじゃねーか。 がんばれよ俺!
ソースを丸暗記って、理解したことになんないよ。 そんな人が書くプログラムは怖くて信用できない。 図を書いて理解するといいよ。
414 :
412 :2007/05/15(火) 05:11:05
いや、丸暗記しちまうくらい、ソースを書いて鍛錬するって意味っす。 さすがにどんなソースでも丸暗記したところで、理解にはつながらないのは 当然なので、よく咀嚼しつつソースを書いて鍛錬しようと思っています。
イディオムとして一瞬で出てくるぐらい使い慣れるって事じゃないの? 長年やってる人とか考える前にコードが浮かんでくるらしいし
>>412 似たような文法ばかりだから、一つやると理屈でなく体で覚えてしまう。
だから身につかない。
pascal系のように少し毛色の違う言語に
移植しながら勉強すると身に付き易いよ
それだけ苦労しても、C++なら全く必要ないって辺りが難だがな。
Cやるのにpascal??C++とJavaを並行するならまだしも あと最初っから体で覚えれるような超天才はまずいないから余計な心配だと思うが…
419 :
416 :2007/05/15(火) 08:15:07
>>418 リスト構造だとCならポインタで書いてると思うが
C++はポインタを書く上でCと同じ、JAVAは・・・・
pascaのポインタは *p が p^ になる。 前と後ろの違いだが
違うことで、共通の概念が身に付けられる人もいるって事さ。
C++ なら list 使えばいいだけだしなあ。 でも、理屈が分かってないと使用時のコストの見積もりもできないから 理解しなくてもいいというわけではないけどさ。
>416 LispとかHaskellとかPrologとかやると Pascal系が「毛色が違う」なんて思えなくなるよ。 CもPascalも「え?ほとんど一緒じゃん」に変わる。
せめてメンバ関数とコンストラクタデストラクタは使わせてください… それらすらないCでの実装は結構面倒くさいです あと出来ればテンプレート構文も
423 :
416 :2007/05/15(火) 08:41:44
C++のlistはたしか双方向では?
424 :
416 :2007/05/15(火) 08:48:56
>>421 毛色が違う程度に違う複数言語で同じ事をやると、扱ってる概念が身に付き易いのであって、
そこまで言語にリスト構造取り込んでると、「毛色が違う」レベルじゃなくて種が違うというレベルだろと思うが?
リスト構造ではなく、もっと高位概念なら「毛色が違う」レベルも広がるとは思うのだが
そもそもCを勉強したいのにPascalとか横道それるのがよく分からん 他の言語でも使える共通概念覚えるなんて一通り使えるようになってからでもいいじゃんか C→C++、C#って行くのが目的だからCは最低限で切り上げるってんなら分かるけどさ
426 :
416 :2007/05/15(火) 08:55:47
違うって。 身に付けたいのはC言語でのリスト構造の扱いなんだろ? そいつを身に付けたいなら、他の言語にCのコードを移植したり、逆をやったりした方が早道だって言ってるのさ
最初からマルチバイリンガルな人だったら確かに早いかもしれない しかし、態々新たに他の言語の勉強するんだったらかなり遠回りになると思うんだけど
急がば回れって言うじゃなーい?
429 :
デフォルトの名無しさん :2007/05/15(火) 09:15:46
データ構造の勉強ってそんな面倒くさい事しないと駄目なんか 流石に教科書と睨めっこするだけよりは確実に手っ取り早いだろうけど あと他の言語覚えるのも兼ねてればやる気出るかもしれんな、 ただそれでC#やJavaなんて覚えた日にゃ一生Cに戻ってこなくなるかもなw
他言語に手を出すより、自分にとって意味のあるデータで数をこなすほうがいいと思うけど。
言語そのものを覚えるのと、アルゴリズムの理解は、そりゃまあ別だろうな C#やJAVAだと、アルゴリズムの理解じゃなくてアルゴリズムを実装したライブラリの使い方の話になってしまうように思う
まあ、色んな言語に手を出せば、 色んな視点が養われていいと思うけどね。 ある言語では当たり前のことが、 別の言語では当たり前じゃない、 ってのを経験するのは悪くない。
まあPASCALならC言語以上に簡単だから、遠回りって程じゃないように思うけどな 人によって違うのかもしれないが。
パスカルってポインタ扱えるんだ・・・知らなかったよ
435 :
デフォルトの名無しさん :2007/05/15(火) 09:40:21
char str[50]; という配列に、fgetsを使って標準入力で「abc/def/ghi/jkn」という文字列を格納して 次にそれをprintfで表示しました その後またfgetsで標準入力から例えば「Hello」という文字列を格納して printfで表示しようとすると、最初に入力した文字列が残っているのか、 変な文字列が表示されてしまいます これはどうすればいいんでしょうか
今は組み込みでさえC++使える時代なんで、そもそもC言語にこだわる必要が無いだろう データ構造まできたらC++でとっととジェネリックプログラミングの方向に行ったほうがいいと思う 車輪の再発明的なアルゴリズム、データ構造の実装に関してはCより遥かに楽にできるし
>>435 その部分のコードを書いてみて、
>>436 組み込みではC++は使えてもSTL解禁とまではいかないよ
それにテンプレートで単純リスト扱うのって俺様テンプレートって事だろうけど、これは一番嫌われる。
スレ違い
>>435 fgets()は最後に\0を付けるので、最初に入れた文字列が残るってこと
はないはずです。あなたのコードを示してみましょう。
>>440 その表、なんかところどころおかしいなw
リストの勉強したいなら、「データ構造+アルゴリズム」とかの本で勉強すると良いよ
ヴィルト先生の教科書とか
>>436 組み込みの現場はまだCのところが多いぞ、C++使ってるところもあるけど
Cしか知らんやつらがどんなコード書いてるのか、想像すると怖いw
>>441 未だにレガシースタイルで関数を書こうとしたり、変数の使い回しに手間隙掛けたり想像を絶するよ。
void foo(a, b) int a, b; { ほげほげ } とか、FORTRAN のプログラム読んでるみたいだよ・・・。
ある文字列1が、ある文字列2と一致しているかどうかをチェック方法にはどのようなものがあるのでしょうか?
strcmp(str1, str2) == 0
>434 Delphiだと、文字列型や配列型が組み込みだからポインタ使わないし オブジェクト型の変数もデフォで参照なんで普段はポインタを使う場面が少ないけどな。 少し突っ込んだ使い方する場合は使うかも。(CのDLL使う時は当然必須だし) あれは最初に「何型へのポインタ」って型を定義するところが特徴的。 例えば整数型へのポインタには整数を指すアドレスしか代入できず 値を戻すのも整数型の変数にしかできないはず。(キャストした場合は別だけど)
基本的にはそうなんだけど、抜け道としてabsolute という強力な指令があるので、 いちいちキャストも必要ない var pc:^char; pb:^byte absolute pc; pw:^word absolute pc; とやれば常に pc=pb=pw になるわけ
それは共用体みたいに メモリを共有する感じ?
Del厨巣に帰れ
>>448 union というより
#define pw ((word *) pb )
のように、別名を与えるような感じ。
union相当は record型でcase文を使う事になる
クロストレーニング 特定の競技のみを行なっていると、どうしても身体の一部に負担がかかり、故障の原因となります。 クロストレーニングをすることにより予防することもできますし、 いつもと違う動作は、あらゆる筋肉を使ったり柔軟性を高めたりすることも可能ですし、 何より精神的にリフレッシュできます。
452 :
デフォルトの名無しさん :2007/05/15(火) 22:57:21
>>452 おまwwwwwwww立命乙wwwwwwww
>>452 とっととfftかけろやw
使い方まで書いてあるやんwww
ただデータ一個ずつ読み込んで関数に渡せばいいだけとちゃうん
456 :
デフォルトの名無しさん :2007/05/16(水) 02:23:18
三角関数の値を出力したいのですが、 その出力する値をsin,cos,tanの3つのどれかから1つ選択できるようにするにはにはどのようにプログラムにすればいいのでしょうか?
選ぶってことはプログラムに対してなんらかの入力を行わないといけないよな だから入力を受け付ける関数を使えばいいんじゃないか?
>>456 グラフを描く関数に引数としてかグローバル変数としてか、関数ポインタを渡せばいいでしょう
グローバル変数は邪悪
グローバル艦長は御髭
>>458 そこでなぜ、「グラフ」?
#我々は神の御技を目の当たりにしているのか?w
>461 「三角関数の値を出力」を脳内変換で「三角関数のグラフを出力」と置き換えてしまったと推測できる
463 :
デフォルトの名無しさん :2007/05/16(水) 14:41:29
画像上の数点の座標を使って、その画像上に最小二乗法を使って直線を描くプログラムを作りたいんですが、誰か教えて欲しいです・・・お願いします。
>>463 座標値から直線の式を求めたいのか、
直線を描画したいのか、
丸投げしたいのか、
ポイントを絞ってください。
465 :
デフォルトの名無しさん :2007/05/16(水) 14:54:52
>>464 コメントありがとうございます。
座標値から直線を描画したいです。よろしくおねがいします。
は? 1.座標値から直線の式を求める 2.直線を描画 3.丸投げ 数字で選べ
467 :
デフォルトの名無しさん :2007/05/16(水) 16:26:22
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; }
for は習ってないの?
その気持ちの悪いインデントは何式なの?
if(hoge) { hage; } というタイプのインデントなら見た事ある。
>>469 縦横に並ぶ表を見たら、先ずは縦と横でループを回すことを検討しろ。
int num = 0;
for (int iy = 0; iy < 3; ++iy) {
for (int ix = 0; ix < 3; ++ix) {
++num;
printf("%d", num);
}
}
>473 えらそうにしてても改行忘れてるからバカ丸出し
紋切り型の表現を見つけるとすぐに「えらそう」と難癖つける香具師は多いが、
そんな輩に「バカ丸出し」と言われるほどのミスとも思えないが。
>>469 というわけで、>473の二つの}の間にprintf("\n);を補うこと。
>>470 まだ習ってないです
それと、どうしてもwhileで作ってみたかったんです
>>471 多分、我流です
>>473 ・・・解りそうで解らない
インクリメント、デクリメントがイマイチ解ってない上に、座標計算っぽいので
それをボクが使うのは少々早い気がします
whileでは無理なのでしょうか?
>>475 了解です
これさ、変数一個で作ろうとすると微妙に難易度高いよね
int num,iy,ix; num = iy = ix = 0; while(iy < 3) { while(ix < 3) { ++num; printf("%d", num); ++ix } printf("\n"); ++iy; }
++ix → ++ix;
>>477 詐欺臭いけどこういう方法とか
int main(void){
int num = 0;
while(num < 10){
printf("%d",num++);
while(num % 3 == 0){
printf("\n");
}
}
return 0;
}
>473 頭悪そうな上にコード違ってるからバカ丸出し というわけで、インクリメント位置をちょっとずらしてくれ、あと初期化値も1に
>481 つ鏡
>474は>480に「えらそうにしてても内側のwhileは入ったら無限ループだからバカ丸出し」と言うッ!
>>478 これだとforの方が解り易いですね・・・
>>480 これぞ求めていた・・・!
と思ったら無限ループしますね(´・ω・`)
>>481 解りました
>>481 0からスタートして、インクリメントしてから表示しているから問題ないんでない?
#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習ってないなんてことはないよね?
習っていないなら今ここで覚えればいいだけ
覚えるのはいいけど、宿題にはならないよね。
>>486 おお、まさにこれです!
流石にifは習っています
>>487 まぁ、そうなんですが・・・
forとかインクリデクリは、参考書やサイトを見てもイマイチなので・・・
switchとかgoto見たいなのは習わずとも解ったんですけどね・・・
>>488 宿題じゃなくて、授業の復習みたいな感じです
ここ超初心者が来ると途端に偉そうなのが大量にわくよなw
だってスレタイの初心者が意味するところは 初心者が回答できるということだから
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 が()内に入っただけ
489みたいなタイプは信じれる何か(先生とか本とか)に教わるまでは 新しいもの覚えるのに躊躇するんじゃない 無理して手伸ばす必要もないと思うけど
そうか? 宿題でもないのに試してみる人だぜ?
C言語って一定時間待つようなコマンドはあるんでしょうか?
sleep()
コマンドは(ry
>>497 ありがとうございます、早速使ってみます
コマンドって何?
あー、すいません、ついその言葉使っちゃっただけです
system("sleep 1");
その話題もう終わってますから
言語仕様には sleep なんかないけどな。
ここは環境依存おkだし
そうなのか?
そうなの
(A)アルファベットを入力してくださいというメッセージを出し、キーを入力させ もし小文字アルファベットが入力されたら大文字アルファベットに変換し終了 もし大文字アルファベットが入力されたら小文字アルファベットに変換し終了 それ以外が入力された場合は、(B)再入力を可否をYかNで選択させる Yなら一番最初(A)に戻り、Nなら終了 それ以外ならエラーを出し、Bに戻る このエラーが10回繰り返された場合、終了させる っていうのを作りたいんだけど、如何書けばいいかな?
#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);
break; } else if (islower(text)) { text = toupper (text); printf ("入力されたアルファベットの大文字は %c です。" ,text); break; } // trans end
// error start } else { num = 0; while (num != 10 || text != 'Y' || text != 'N') { printf ("エラー\n" "アルファベット以外の値が入力されました。\n" "\n" "継続して入力しますか?\n" "Y/N\n");
text = getchar (); switch (text) { case 'Y': case 'y': continue;
case 'N': case 'n': break; default: ++num; } //switch } //while } // else } // while printf ("\nExiT"); return 0; }
514 :
デフォルトの名無しさん :2007/05/19(土) 01:14:23
515 :
デフォルトの名無しさん :2007/05/19(土) 02:43:34
int nAll[4800000]; みたいな巨大な配列を宣言すると、アプリエラーになってしまいます。 どうやれば巨大な配列を使えるのでしょうか?
516 :
デフォルトの名無しさん :2007/05/19(土) 02:46:11
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桁くらいしか記憶できないから,何億桁,何無量大数桁もの計算結果をコンピュータで扱いたいときは・・・どうすれば??
磁気ディスクに書け。
>>515 そもそもそんなに大きな配列を一度に扱う理由が…。
ファイルをメモリに見立ててランダムアクセスするとか、
処理の前にサイズを計算して必要な分だけ動的確保するとか、
アプローチを考え直す方が良いかも?
ファイルに書き出して扱うとか?手間や処理時間は掛かるだろうけど、手段を選べばやれないことはない。 ってか、可能な範囲内で配列をもっと多く宣言できるといった話をこの板のどこかのスレで聞いた覚えが・・・
522 :
デフォルトの名無しさん :2007/05/19(土) 02:59:09
宇宙分野の科学技術計算でそのくらい必要かと思いましたが,そうでもないのでしょうか? 素人なのでよく知りませんが
ソートであれば外部ソートてのがある。
524 :
デフォルトの名無しさん :2007/05/19(土) 03:00:27
ファイルに書き出すらな何百GBものメモリが利用できるな スワップみたいなもの?
詳しく知らないけどアポロ計画の物理演算用コンピュータは 処理性能は数年前の古臭いPen2パソコンと比べても遥かに劣るらしいぞ。 ノイマン型かどうかすら怪しいけど。
526 :
デフォルトの名無しさん :2007/05/19(土) 03:02:29
>>521 俺も半年くらい前にこの板のどこかのスレで聞いたことがある
なんかオプションを指定してやるんだっけな?まぁコンパイラの説明書嫁
ファミコン並とも言われてるしな
>>522 素人なのに、40GBの計算結果が出るって、
一体どうやって見積もったんだ?
どんな技術計算でも、桁数多ければいいってのは無いだろ。
PIの計算でギネス狙うとかじゃない限りさ。
メモリマップトファイルでいいじゃん
530 :
デフォルトの名無しさん :2007/05/19(土) 03:03:22
俺の頭波とも(ry
>>528 実際の航空宇宙分野現場ではどのくらい使われているのでしょうか?
大量のフラグが必要なのですが、何億も使うわけではなく数百万ぐらいが必要です。 とりあえずmallocでやってみます。 ありがとうございました。
>>515 int n;
桁数を入力⇒scanfでnに代入
int *a = (int *)malloc(sizeof(int) * n);
if( a == NULL ){ printf("メモリ確保失敗\n"); exit(1); }
この方法だとsigned int型のnに27億くらいしか指定できない
320ギガビット整数なら1.03e+11桁くらい扱えるようですね。
Pythonだとデフォルトで何桁でも計算してくれるんだっけ
まさか
Pythonコマンドラインで計算してみた >>> 54354353453453535435 * 54353444444444444 2954346330745983744467924576242873140L Lって出てきたけどCよりはるかに多い
>>533 unsigned int制限の27億以上入力したいなら nもまた配列やポインタにしなきゃいけない
ってなるとコードがゴチャゴチャ
>>538 そうなったcを諦めてc++で書けばすっきり。
横からスマンがC++はどうなるんですかい?
普通に考えてsize_tで表せるサイズ以上の確保は無理だろ
連続領域である必要などどこにもない
大きすぎる場合はメモリだけじゃどうしようもないから ディスクを利用したりするよ。 あるいはクラスターマシンで並列化するとか。
あるいはターミナルに出力してオンデマンドで打ち込んでやるとか。
なんか自分のプログラムのコメントの書き方が汚いような気がします。 どういうコメントのつけ方をすれば綺麗で見やすいプログラムになるのでしょうか? 自信のある方、注意やレイアウトなどを教えて頂けると幸いです。
ソースを書く前にプログラムの内容や流れをきちっとまとめなさいと。 ライブラリを用いて、この部分ではどういう役割を持った記述をするのかはっきりと定義すること。
形式はJavadoc, Doxygenに倣えばよし。 実際のコツということなら他人のソースをある程度読み込んで 良いところはパクリ、悪いところは反面教師とすればよし。
doxygenとsandcastleみたいなXMLコードコメントスタイルってどちらがいい?
自分で決めろよ。
そりゃ開発環境や使うツール次第だろ。 VSなら実質XMLDoc一択だし。 もし一切の入力支援なしということならDoxygen&JavaDocスタイルが楽だと思う。
これからCでプログラムを書けるようにしたいんですが、 本やホームページによって、0から文字だけを打って作っていくものもあれば、 VisualCを使って、視覚的にウインドウも同時に作っていくものもあります。 これは、どちらの方法でもC言語のスキルとしては同じレベルまで身につくのでしょうか。 それとも、違うものとして認識したほうがよいでしょうか。
行き着く先は一緒だろ 視覚的なほうがモチベーションの維持が楽だから、そっちでやったらどうよ あんまりプログラミングしてる気分にはなれないかもしれないけど
いいえ。
C++ではなくC言語にあえて拘るなら、組込用途に特化した方がいいと思うよ。 たとえば、GBAとかかWonderWitchのような携帯ゲームとか 秋月電子でH8とかM16のボードキットとか のプログラムをやるとかさ
>>551 君は、C言語がやりたいのか、C++がやりたいのか
556 :
デフォルトの名無しさん :2007/05/26(土) 10:36:01
16進数は0xをつけますが、2進数はどのように書けばよいのでしょうか?
どのようにも書けません。
>>551 質問を思いっきり無視するが
・C/C++の言語・標準ライブラリの学習
・Visual Studioの使い方、Win32API, MFC, .NETフレームワーク等の学習
・自分の作りたいもの
をバランスよくやっていくのが吉。
特にデバッガの使い方は早めに習得しておくといいよ。
>>551 出だしはGUIだろうがCUIだろうが、どっちでも一緒じゃない?
俺の経験で言えば、mallocやprintfを自分で実装するような世界へ行かないと
C言語の深淵は見えてこないと思う。
まぁそこまで行っちゃうと環境への依存性強すぎて
「C言語のスキル」と言えるかどうかは謎だけど・・・
環境依存こそC言語のスキルだと思うよ。 違う中での共通項に、身に付けるべき概念があるわけだろうからね
561 :
551 :2007/05/26(土) 13:10:13
>>555 C言語です。
みなさん、ありがとうございました。
やっぱりモチベーションのことがあるので、
今はGUIで、いろいろな面から進めていきたいと思います。
でも、CUI → GUI の方が良いよ
>>561 君の目指すところがわからないんであれだが
単にC言語を覚えたいだけなら、CUIのほうが良いと思うぞ
GUIだと言語以外に覚えないといけないことが多すぎるし
C言語でWindowsアプリは入門者にはきついと思うぞ
564 :
551 :2007/05/26(土) 14:17:48
>>562 基本部分はCUIの方が勉強になるということですか。
>>563 情報が少なくてすみません。
目標としては、Windowsアプリであれば、簡単なメモ帳程度から初めて、
ウェブブラウザが作れるくらいまでいけたらと思っています。
また、WindowsだけではなくLinuxも使っているので、
Linuxでも動くプログラムが書けるようになりたいと思っています。
そこで、C言語で基本を押さえておいて、Windowsアプリを作りたくなったら
C系のほかの言語に移るのもありかなと思っています。
とすると、C言語はまずCUIでやるべきでしょうかね。
Cだとメモ帳を作るってだけでも・・・まあEDITコントロールを貼れば無理ってほどじゃないが 結構負担の大きいチャレンジだと思うぞ。 さらにブラウザを作るってのも、ActiveXでIEを貼るとしたって、まあ、初心者の目標としては、まず無理。 GUIがやりたいなら、Delphiとかである程度作法や仕組みがわかってからやった方がいいと思うぞ。
566 :
563 :2007/05/26(土) 14:30:24
>>564 そういう目標ならC言語はまったくお勧めしない
C#あたりからはじめたほうがいいと思うよ
567 :
551 :2007/05/26(土) 14:39:07
分かりました。親切にありがとうございました。 別の言語から勉強していきたいと思います。
ic = ia&ib; はどのような意味を持ち合わせているのでしょか?
569 :
デフォルトの名無しさん :2007/05/26(土) 16:34:51
>>568 その質問は数学者に1+1の意味を尋ねているようなものだ
未定義の識別子icに未定義の識別子iaと未定義の識別子ibのAND演算の結果を代入する
>>568 意味は、どう抽象化してるかによって違ってくる。
ビットをクリアしてるのかもしれないし
モジュロ演算の代用かもしれないし、
書き忘れてました、 ia=0x0B0A; ib=0x0F0A; です
それじゃ、ic = 0x0b0a & 0x0f0a;ということだ。
>>555 ,556辺りを見て思ったんですけど、
逆にC言語に向いてるものってなんですか?
575 :
574 :2007/05/26(土) 22:43:17
C言語に向いてるのは
>>554 のような組込マイコン向けの開発なんかだね
577 :
566 :2007/05/26(土) 22:49:55
>>575 CUIプログラム、サーバプログラム、組込み系、デバイスドライバ、OS、学校の宿題
適当に思いついたものを列挙してみた
578 :
574 :2007/05/26(土) 23:10:17
そうか。学校の宿題は別として、比較的低級なものととらえられそうですね。 ありがとう。
GUIがつけばなんでも高級だと思える人が多いからね。
プログラマでその発言はあまりにも痛いぞ
学校の宿題は高級なんだ……
ん?574の低級はそういう意味の低級だったのか?
レベルの高低とレイヤの高低を混同しちゃうのかよ
商品は見た目が大事
C言語は「低水準」だが「低級」ではない、って話は黎明期によく聞いた。
アセンブラだって機械語からすれば高級言語 スクリプト系/VM系が発達してきてるから 最近はCも低級言語って言われ始めてるよね
低級ってハードウェアに近いってことじゃないの? 組み込みだったり、ドライバだったり、OSだったりって 全部ハードウェアについて詳しく知らないとできないじゃない。
>>586 > 最近はCも低級言語って言われ始めてるよね
うちの近所じゃ, 昔から高級アセンブラって言われますが...
アセンブラやってる俺から見ればCなんてクソ言語 なんでまともなコード出力しないんだあれ?
それは言語のせいではなく、処理系のしかもコードジェネレータのせい。
>>589 値段の安いのかフリーしか使わないからじゃないの?
あと、アセンブラ出力見ながら、書き方を調整するといいよ。
>>589 Woodcrest用にiccよりも高速なコードを書けるのなら、是非ご協力願いたい。
当方「手段を問わず高速化」を求められているプロジェクトに参加しているので。
>>588 >> 最近はCも低級言語って言われ始めてるよね
>うちの近所じゃ, 昔から高級アセンブラって言われますが...
んなこたねえだろ
うちでは、高級マクロアセンブラと呼んでたぞ
お前のせいで高級マグロ食いたくなった
>>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| \ ソ
何を知ってるというのだ?
無知の知を知ってるんだろ
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も導入しています。
bccはフォルダにコピーするだけじゃなく環境設定が必要だぞ。 詳細はググレカス
>>600 はborland5.5を導入したって言ってるんだからそれは無いな
ちなみにC\cpには 元ソースであるhello.cと、hello.objが作成されています。 本来であればhello.exeが出来なきゃいけない?と思うのですが・・・。 bccの環境設定は出来ていると思います。
>>594 手段を問わず高速化するならまず大量の資金をインテルに投じて、
人的にも設備的にも最高品質の資源を世界中からかき集めて、
woodcrestの性能向上を図るべきだな。
もうアーキテクチャから何からあらゆるものを変えて名前だけを残すくらいに。
>>603 だからよ、EXEを作るのにC0X32.OBJが必要なんだよ。
LIBの設定やってないんじゃないのか?
説明読んだか?
とりあえず環境変数を晒すんだ
すいません、自己解決しました。 LIBの設定はしていたのですが、単純なタイピングミスでした。 修正したところ、無事コンパイルが通りました。 レスいただいた方、ありがとうございます。
>>603 本当に設定できてるのか?
binディレクトリにちゃんとbcc32.cfgがあるか確認汁
bcc32.cfgが無かったり、きちんと設定が書かれていないときに出る症状だぞ
>>609 bcc32.cfgは作成しました。
とりあえず教本の通り進めているので、現状は問題ないと思います。
ちなみに教本は本屋の雑誌コーナーで買った
日経ソフトウェアの「ずばりわかる!C言語 Cプログラミングの基礎を徹底理解」という
A4サイズのオレンジ色の本です。(ISBN978-4-8222-2840-8)
>>610 環境変数でLIBを設定したらbcc32.cfgの設定より優先されるからね。
プログラミングの課題で 【直角三角形の長辺と底辺の値をキーボードから入力し、 その二辺の角度(°)を画面に表示するプログラムを作成せよ】 って課題で、先輩に聞いてもわからないらしい 何かヒントを教えてくれないだろうか?
つarccos
>>612 それのどこがCの質問?
#寧ろ中学数学だろうよ
なんという馬鹿学校
>>613 acosを使うとうまく値が出てこない
>>614 確かにその通りだ
数学がわからないからプログラミングができない
うまく値が出てこないのはacosを使ったからではなく、お前が使い方を間違ってるから。 しね
618 :
デフォルトの名無しさん :2007/05/28(月) 15:24:14
ポインタが有って良かった っていうケースについて教えて下さい ポインタは何となく分かりましたが 「これがあるとこんな恩恵に預かれる!」 ってのがイメージ出来ません 変数の実態に値入れれば良いじゃん って思っちゃいます ポインタがなければ実現しえないケースでも良いです 誰かサンプルケース下さい
>>618 例えば巨大な構造体をある条件でソートする場合
構造体そのものを入れ替えるとすごく時間が掛かる
「構造体のポインタ」をソートすると速い
標準入力でテキストを読み込んでソートして結果を標準出力に書き出すプログラム作ってみろ。
>>618 参照を持ってる言語だと
>>619 のようなメリットも参照で代用出来るわけで
唯一あるとすれば、字句解析の場合かな
字句解析では 現在の文字、次の文字に進む、最後の文字か? の3要素が必要だけど
ポインタだけでこの3要素を実現出来て高速。
恐ろしく的外れなレスをミ田
C言語スレだよな?
>>618 じゃ、勝手に ここまでのまとめ
ポインタには 参照 reference の代用としての用途と それに収まらないアドレスそのものとしての用途の2つがある。
参照とはそれ自身はデータではなく、外にあるデータを指しているというもの
scanfのように、関数の引数に値を返すような場合が参照渡しの代用例
参照に収まらない用途の例は、while(*p++) if(*p==',') break; のような使い方。
文字列が連続したメモリ上にある事を利用し、
ポインタがメモリのアドレスを示す特性を使って、高速に文字スキャン等を行うというもの
ここまで読み手に配慮しないオナニーレスも珍しい
>>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;
}
>>614 acos は高校ですら習わないことないか?
>>618 C だと、そもそもポインタがないと関数への配列の受け渡しが不可能。
>>631 驚くべきことに大学にずれ込み始めてきている
あ、読み違えてしまった
ずれ込み始めても何も、 acos を高校までに教えてた時代っていつだ? あるの? ましてや中学って。
高校でも工業系ならやると思うよ。 高専なら1年でやるんじゃないかな
逆三角関数を知らなくても、そういうものがあれば求められるくらいの頭はあるだろ。 少なくとも私は関数電卓に遭遇した中学時代には承知してたよ。
俺なんて関数ってもの知ったの大学入ってからだし
ラジアンも知らない人間に acos 使えとだけ言っても、 トンチンカンな答えが返ってきても仕方がないと思われ。
同じく関数電卓にあったので高校で初めて触れたbasicで普通にラジアンを使ってた漏れ。 つーか、今時判らなければ調べるのが当たり前だろ。
弧度法なんか中学で習った覚えがあるんだが、今の指導要領だと高2なのな。 なんというゆとり。
10年以上前でも高2だったというのに、 中学で習ったって人は一体何歳なんだろう? 40代?
>>643 解の公式はやらなかったので、何でも平方完成で解いた
1.4142...は雑談程度には出てきた
アホほどくだらない話題に嬉々としてわいてくるな
>>644 40代でも高校ということは、
50〜60代くらいか? 中学は。
あるいは、その時代の進学校なら、
中学でも触れてる可能性はあるのかもしれんが・・・。
中高一貫校なら高1の内容を中3でやるのかもしれないな
俺もラジアンは中学で習ったな。私学だけど。
まあ、正直三角関数くらい中学でやっていいような内容だと思うけどね。
だから、習わないと使っちゃいけないわけじゃあるまいし、調べればいいだけのことだろ。
何が「だから」だよ。みんなそう言ってるじゃないか。
正直高校や大学で一通り数学、物理の知識を身につけても 結局その知識を使う環境が無いまま年齢重ねると 公式や、微分の基礎なんて忘れちまうよ。 あの頃はすらすら解けたのにっていうのがざらにある。 社会人になったら、そういう部分よりも必要なスキルやコミュニケーション能力等 が重要になる。 ま、結局必要な分野の知識以外はおのずと薄れていってしまう。
プログラミング言語もしかりだな。 使わない言語は勉強しても忘れる。
英語もだ。
俺英語バリバリだよ? I'as pen!
>>656 の書き込みを見て高校時代の会話を思い出した
俺「俺、もう中学レベルから英語わからへんわ」
ツレ「中学レベルっていったら、I am a Penとかやろ」
俺「まぁ、それくらいやったら解るけど」
・
・
数日後
俺「I am a Penってどういう意味やねん!」
私はPenです
あたいアペン、よろしくね☆
You is big fool man hahaha ってやつ?
You って名前の人か。
もう10年も昔の話なんだな>you is a big fool man
All your base are belong to us.ってなんであんなにうけたんだろう
>>663 「日本は反省しる」とだいたい同じような感じでうけた。
つまり超シリアスな場面でまじめな顔をしてそんな間抜けなことをやらかしたから。
>>663 超シリアスな場面で使われたことがポイントらしい。
「反省しる!」も韓国の議員が背広姿で大真面目に日本の国会議事堂前で
かましてくれたからこそ、大きな意味がある。
分単位で遅れて思いっきり被った。orz
667 :
664 :2007/05/29(火) 22:26:00
似たような語彙で説明してるのがウケタw もう結婚しているので、結婚は勘弁してください。
668 :
665 :2007/05/29(火) 22:30:33
じゃぁ、別れてなんて言わないから愛人にしてください。
「じゃあね」なんて言わないで〜
アノコにもしも飽きたらすぐに呼び出して〜
671 :
665 :2007/05/30(水) 02:34:08
672 :
デフォルトの名無しさん :2007/05/30(水) 13:17:31
関数内で取得した文字列を戻り値として返したいのですが、 そのような方法はありますか? 関数内で取得した文字列は関数内のローカル配列に格納するので、 配列の先頭アドレスを返そうとすると、 function returns address of local variable といわれてしまいました。
staticにするか、 動的に割り当てた領域を返すか(開放は呼び出し元の責任で)、 文字数の最大値が決まっているなら呼び出し元が割り当てたものを関数に渡して それに入れてもらうか。
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を入力してログインがしたいです。 どなたか分かる方、宜しくお願いします。
ftpは全コマンドをファイルにしてそれを実行することができるが そうでないなら、自分でソケット開いてftp操作すれば。 ソースだってあるし、そんなに面倒じゃない。 あとは、呼び出すコマンドが対応していれば、パイプでつなぐ手もあるけど
なんかよくわかんなくなった 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の操作と言うのは、
具体的にどういった処理になるのでしょうか?
ちょっとわからん・・・ int x=2; は正しいのに int *p; *p=2は正しくて int *p=2はエラーになるのはなんで?
連続スマソ。。。最後にこれだけ聞いてくれ 引数そのものを変える参照渡しの応用っぽい感じで 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; }
>>680 思いついたそばから書き込まないように。
関数にはコピーを渡すんだからそのアドレス持ってきたってどうにもならん。
>>679 (int *) p = 2;
はダメだろ?
そのあたりは、Cの定義の仕方が勘違いしやすい原因
ポインタは typedef して 考えてみるといいよ
>>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変数の中途半端なところを指してしまいおかしいことになる。
>>680 func関数でmalloc関数を使って領域を確保して、確保した領域を指すアドレスを返す。
ただし、プログラム終了後にfree関数で確保した領域を解放するのを忘れずに。
あと、static変数を宣言する手もあるけど。
ちなみに
>void func(int *p,int x){
>p=&x;
>}
だと、func関数を抜けた時点で変数xは消滅するので、消滅した変数xのアドレスを返しても使えない。
「プログラム終了後にfree関数で〜」じゃなくて「プログラム終了時にfree関数で〜」でした…
>>677 >*←このマークが、これはポインターだよってことを示す印で・・・
「宣言」のときはそうだが、「式」の中では違う。
*(ポインタ) は 「ポインタの中身」。
なので
>>679 >int *p;
>*p=2は正しくて
ポインタを「宣言」して、ポインタの中身を2にしてる。
>int *p=2はエラーになるのは
ポインタ自身に整数は突っ込めないから。
>>685 >プログラム終了時にfree関数で〜
関数を呼び出した元で、その領域が不要になり次第解放すべき。
>680 >int *p; >*p=3; なんにもわかってねー
>>680 もう一度ポインタの勉強をした方がいいね。
あと、自動変数・静的変数の仕組みも。
図にして書くとわかりやすいよ。
>680 funcのpとmainのpは別物。 ローカル変数同士同じ名前にしても関係ないのは、ポインタ変数でもかわらない。
int* func(){ int *p = (int*)malloc(4); return p; } このような関数の戻り値を使うことに問題はありませんよね? 友人に「ローカル変数は関数抜けたら開放されるからどこ指すのかわからなくなる」と言われ混乱しています。 mallocで確保したメモリ領域はfreeするまで開放されないと思うのですが・・・
ローカル変数である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"); }
>>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 を用いて記述しなさい。 誰か助けてください。
*p = 100;
なんでこんな唐突にポインタ周りの質問が噴出したんだ?
int a, *p = &a; *p = 100;
4月からの授業がポインタまで進んだのかね。
Microsoft Visual C++ .NET2003 を使ってみた者なのですが hello would!等 と打ってみたのですが 正常終了しただけで でーんと小ウインドウでhello would! と表示されないのですが どのように設定したら良いでしょうか??? よろしくお願いします。
dとs 間違えました;;
>>700 F5で実行したのね。
とりあえずCtrl-F5で。
正常に実行されて一瞬で閉じちゃうから { char buf[256]; gets(buf); } とかmainの最後に入れとけ。
getchar();でよかろ。
皆さんありがとうーーー。
変数ってどうやれば出来るんですか?
まず、メモリ空間を確保します。
恋人ってどうやれば出来るんですか?
まず、たくさんの人とコミュニケーションすること。 恋人ができれば、Cまで行くのは簡単だ。
いやまあうまい繋ぎだなとは思うんだけどもね
711 :
名無し :2007/05/31(木) 20:57:32
学校のC言語の宿題を聞いてもいいですか?
だめです。
char型の配列に「AB12C3」って入ってる時 数字だけ消すにはどうすれば……
for(i = j = 0; ; i++) { if(! isdigit(str[i])) { str[j] = str[i]; j++; } if(str[i] == '\0') { break; } }
isdigit の引数を (unsigned char) でキャストするの忘れてた。 ローカルテストじゃやってたというのに。
isdigitのパラメータは int じゃないっけか? それより for(i = j = 0; str[i] ; i++) { if(! isdigit(str[i])) { str[j] = str[i]; j++; } } このほうが、多少シンプルじゃまいか?
ヌルターミネートを忘れてないか?
isdigit のパラメータが int だからこそ、 unsigned char へのキャストが必要になる。 for でヌル文字チェックしたら、 for の後に str[j] = '\0'; が必要。 これでもいいとは思うけどね。
>>716 intだからこそ問題となることがある。
isdigitに渡す引数がchar型だったとして、その値が負なら符号拡張された値が渡されてしまう。
is系関数が受け取れる引数の値の範囲は0からUCHAR_MAXまでとEOFのみ。
よって、負の値を渡したらまず間違いなく未定義の動作になってしまう。
ASCIIの文字だけしか入っていないなど、char型の値が負でないと確実に言えるのであれば、
unsigned charへキャストしてやる必要はない。
宇宙空間並みに密度の濃いスレだなw
そういうときは、charをunsignedとして扱うコンパイラオプションを付けて お茶を濁しておくものだ、って隣のUNIXハカが言ってた。
723 :
デフォルトの名無しさん :2007/06/01(金) 06:54:59
質問です。 char *str[128]; こういう宣言は、128個の文字列のポインタと考えていいのでしょうか? それとも、char型のポインタが128個あると考えるのでしょうか?
>>723 後者です。もちろん文字列の先頭の文字を指すこともできますから、
結果として文字列を指すように使うこともできます。
char (*str)[128]; char *(str[128]);
>>720 マルチバイト文字列の一部を渡す時点で間違いだと気付こうや。
727 :
デフォルトの名無しさん :2007/06/01(金) 17:57:13
L"GJGJ.txt" はキャストできるんですが、 char str[8] = "GJGJ.txt"; この変数を、1行目と同様のキャストをするにはどうしたら良いでしょうか? どなたかよろしくお願いします。
>>727 そもそも一行目はキャストじゃありませんが。
TCHAR str[8] = _T("GJGJ.txt"); こうしたいのか?
って、[8]はだめだろ。コピペしちゃったがw
>>730 わざとじゃね?'\0' を入れたくない理由があるんだよ、きっと。知らんけど。
\0があるまで走り続けたいんじゃね?
C++だとエラーなんだよ。スレ違いだから理由は省略するけど。
そんないきなり語りだされても^^
>>727 L""はキャストじゃない、クオートの中の文字コードが違う
char str[] = "GJGJ.TXT";
wchar_t wstr[] = L"GJGJ.TXT";
コンパイル時に切り替えるのが_Tマクロ
736 :
デフォルトの名無しさん :2007/06/02(土) 01:11:24
Solarisやってればこんなのは普通に会う インクルードのディレクトリの指定が足りないんじゃないか
>>736 がダメなら Solaris の cc だと可変長引数ってどう書くの?
740 :
736 :2007/06/02(土) 03:20:48
あれ? solaris10なら標準でvimが載ってなかったか?
Motifテラナツカシス
c言語で実行結果が下のような一定の繰り返しをするカウントアップ のプログラムを作りたいんですけど誰か教えてください 整数を入力してください:25 1234567890123456789012345
土日あるんだからちったぁ考えろ
printfやputsなんかの関数が#include <stdio.h>に格納されてるって事?
>>743 main(){
int dt;
printf("整数を入力してください:");
scanf("%d",&dt);
if (dt==25) printf("1234567890123456789012345\n");
}
>>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);
}
>for(i = 1; i <= x; i++) { きっとこれが気に入らなかったんだな
宿題丸投げに答えたからだよ
>>746 がセンスの良い(と思ってる)レスをしたのに、マジレスされたおかげで
自分のレスが単なる馬鹿っぽくなったからだろ
当てずっぽうに自演認定しても 恥ずかしいだけだよ
おまいら
>>743 をよく読め
>整数を入力してください:25
整数は全角入力なんだよ!
な、なんだってーー!!
758 :
デフォルトの名無しさん :2007/06/03(日) 13:57:17
>>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; }
>>761 くをっ、こぉのぉ〜!俺のイカソースの一部をパクるんじゃねぇ〜〜!
普通に↓使ってりゃええやろ!w
for(i = 1; i <= x; i++) { printf("%d", i % 10); }
>>746 そのプログラムでは実行結果が
「整数を入力してください:25
1234567890123456789012345 」
↑しかできないから不正解じゃね?
文字列使うんならもうちょい生かそうぜ #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; }
俺も書いたぜ #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; }
>765 センスいいな
>>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;
}
>>768 トマトソースを書いた俺もあんたには着帽したぜ、ベイベー!
>768 つーか間違ってるぞ
なんでこんな唐突にIOCCC?
>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; }
774 :
743 :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); }
流れ断ち切ってすいません たとえば printf("a"); と書くときに printf(""); を先に書いてしまっているんですが やはり左から順に書いていったほうが変な癖とかがつかなくていいんでしょうか?
#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 そんなことないよ
777 :
775 :2007/06/03(日) 19:23:23
>>776 周りに経験者の方などがいないのでどうにも気になってました
ありがとうございます
>>775 それやってると、入力効率悪すぎるよ。
カッコの対応が人目で確認できるエディタを使って、順番に書いたほうがメチャ楽。
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 みたいな感じにもっと手っ取り早い表記ってないんですかね。
プロトタイプ宣言ってなんですか?
そのくらいググれ
プロトタイプ宣言のない関数の呼び出しがどうのこうのってエラーになった時はどうすればいいんですか?
エラーメッセージは勝手に噛み砕かないでコピペしてくれ・・・
>>783 自作関数ならプロトタイプ宣言すればいいし、ライブラリとかの関数なら、適切なヘッダーファイルを#includeする。
超初心者な質問で申し訳ありません ある入門本の一番最初なんですが、 #include<stdio.h> main() { printf("Hello!"); return 0; } でコンパイルすると 「エラー E2209 1: インクルードファイル’stdio.h’をオープンできない 警告 W8065 5:プロトタイプ宣言のない関数’printf’の呼び出し(関数 main) *** 1 errors in Compile ***」 みたいなかんじでエラーになるんです なにが原因でしょうか?
>>786 環境変数の設定がおかしいと思う。
そのコンパイラの名前と「インストール」とかでググれば、設定の仕方がでてくるんじゃない?
>>787 本に書いてあるとおりにやったんで間違いないはずなんですが・・・
ググっていろいろ試してみましたがやっぱりうまくいきません
インストーラー付きのコンパイラに変えてみたら? インストーラーが全部環境設定やってくれるやつ。
環境変数の設定以外で考えられる原因ってありますか?
>790 答えてもらっておいてその答えが信用できないんなら、もうこないほうがいいよ。
もちろんインクルードファイルを何らかの理由で消してしまったとかいう原因も考えられる。
>>792 最初からインストールされてないとかも。
単に環境変数とかパスのスペルミスってことも考えられるね。
本にはPATHの設定しか書いてなかったんですが、他にもすることあるんですか?
795 :
775 :2007/06/03(日) 21:36:02
>>778 両方の意見があるということが聞けただけで参考になりました
とりあえず矯正もしながらやりやすい方法を探っていこうと思います
ものによるよ。
>>788 君もそのうちわかるようになるさ
本は結構、間違っているとwww
書籍だろうがネットだろうが会話だろうが得られる情報に誤謬が含まれていないわけはない
環境変数INCLUDE もしくは、それの代わりの設定(これはコンパイラによる) INCLUDEが無いんじゃ、LIBもないだろうな
>>800 実はそれを書くだけで的確な回答がもらえるはずなのにね。
802 :
デフォルトの名無しさん :2007/06/04(月) 07:22:17
どなたか 10進数の-5.25を2進数で表示する問題の解き方を教えて頂けないでしょうか
n進数は、桁が上がる毎にn倍になる。10進数なら10倍。 同様に、桁が下がる毎に1/nになる。10進数なら1/10。
>>802 結構大変な問題だね。
10進数は小数点以下は2桁で固定? それとも任意?
2進数で小数点以下何桁まで表示すればいいの?
>>802 宿題には、もうちょっと条件ついてなかったかい?
ビット数とか、負数の表現方法とか
16ビットで浮動小数点を表現する S(符号)は1ビットで仮数の符号を表す E(指数部)は4ビットで指数を表し負数は2の補数で表現 M(仮数部)は11ビットで仮数の絶対値を表す 基数は2とする 仮数の0,2進数の少数以下第一位が1になるように、正規化された形で表す 小数点はEとMの位置にする 0の表現はー0と+0の二通りがあり特別に指数部と仮数部をすべて0にする という問題ないようです
>>802 先ずは、5を2進表示する方法を学び、それを小数を扱えるように拡張、更に負数の取り扱いに関して学べばOK。
つーか、2進表現にも色々あるからそれを確認してくれ。
>>806 先ず、絶対値を取り扱う。
5.25を2進表現すると101.01(2)になる。
>806の条件に合わせるには0.10101(2)*2^-3となる。
ここまで判れば後は簡単だろう。
そのままかけると 0.01262625でいいのでしょうか
C言語と関係ない宿題はよそで聞けw
ダメだこりゃ〜
>808は2^-3じゃなくて2^3だな。
>>806 それは
>>802 の問題?
つまり -5.25 は - 21/4 = S[-1] * M[ 21] * E[ 2^-2] と与えられて
これを2進数で表示すればいいの?
それとも-5.25 という文字列が与えられて この形式に変換するのが課題?
浮動小数点数の表現を IEEE 754 なりエクセス 64 なりに仮定していいのであれば、 おもしろいコードを書く事もできるんだけどな。
2倍してある値を超えれば 1 、越えなければ 0 。 これを繰り返して、適当なところで小数点や 0 を補えばおk。
>>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進数化して、指数の位置に小数点を打てばいい
2の結果は12ビットあるから、2進数化するには、 0x800 とAND しては 0なら0 でなければ1 として 左シフトしてゆくといい。 なお、このスレは宿題スレじゃないので、コードは自分で作ること
>>620 #include <stdlib.h>
int main()
{
return system("sort");
}
果たして、そのプログラムの標準入力はリダイレクト可能か?
普通、可能だ。
ほんまや。できた。
system()はコマンドインタプリタを起動するからsystem("ls | sort")、system("dir | sort")のようなこともできる。 #勿論、system("ls | sort > foo")なんてこともできる。
そういう意味じゃなくて、
>>822 をコンパイルしてできた実行ファイル a.out に対して
./a.out < test.txt みたいなことができる、という意味。
リダイレクトはコマンドインタプリタの機能だと言う理解はないのかな?
よく分かんないんだけど、 system でシェルを起動した場合、 デフォルトの標準入出力は継承される、 ということになるわけ?
紛らわしい言い方になってしまった。 >デフォルトの標準入出力は継承される、 #起動されたシェルのデフォルトの標準入出力は、 #それを起動した側の標準入出力を継承する、
一般のOSでは、開いている標準ファイルハンドルはシェルに限らず子プロセスに引き継がれるね。
834 :
822 :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;
}
835 :
822 :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)); }
836 :
822 :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; }
837 :
822 :2007/06/04(月) 15:41:19
s/marge/merge/ orz
イ`
839 :
786 :2007/06/05(火) 19:18:16
もう一冊別の本を買っていろいろ試してみたらやっとできました みなさんから見たらなんでもないことかもしれませんがすごくうれしいですね 親切に教えてくれて方どうもありがとうございました
FILE *fp; fp=fopen("FileName","w"); この部分って、fopenが"r"のときはエラー処理入れるけど、wのときはエラー処理いれなくていいの? 何らかの理由でファイルが作成できない場合ってないの?
つ[規格票]
既に排他的にファイルが開かれているとかでエラーになる事はあるだろう
今更だけどFDのライトプロテクトとかの場合はどうなんのかな
・ 排他処理により書き込み禁止になっている ・ ディレクトリに書き込み権限がない ・ ディスクフルでそのディレクトリにファイルを追加することすら不可能になっている こんなところか。
ここが一番初心者向けのCのスレでしょうか?
開発環境を整えたいんですが、コンパイラはなにを使うのがおすすめですか? OSはWINXPです。
>>847 コンパイラは cygwin (gcc) 、エディタはTeraPadとかいいんでね?
ぶっちゃけ、好みの問題だからなぁ。
>>847 Visual C++ Express Edition 2005 でも落としとけ。
>>849 一応、最終的な目標はゲームを作ることです。
>>850 ありがとうございます。
とりあえずVisual C++ Express Edition 2005を試してみようと思います。
852 :
デフォルトの名無しさん :2007/06/06(水) 21:56:13
これからC言語をはじめようと思うのですがどのコンパイラを使えばいいのでしょうか? OSはVISTAです。できればフリーソフトでダウンロード方法とかも教えてください。
ググれカス
854 :
◆lIN/ESgxWw :2007/06/06(水) 22:31:40
他の掲示板でも質問したんですが、イマイチ回答が得られなかったんで コチラに質問させていただきます。 「1本の道に,食べ物が多数落ちている. ランダムに動く動物が,それらを全て食べ尽くすと終了するようなプログラムを作成せよ.」 <仕様> [「道」は要素数20程度の1次元配列で表現する. 「食べ物」は,上記配列の各要素に値1があればその場所に存在し,値0であればその場所には存在しないものとする. 「動物」は,1回の移動で配列中の1つ左または1つ右に移動できる. 「動物」の訪れた場所のエサは食べられたものとする. 「道のうち食べ物のない箇所」,「道のうち食べ物のある箇所」,「動物」は,それぞれ -, *, O で表現する.それらを横一列の文字で表示する. 繰り返し処理中は,毎回数十〜数百ミリ秒程度の時間,実行を一時停止させることで,状態の推移を見やすくする.] といった感じのプログラムなんですが、よろしくお願いします。 ちなみに補足などについては、 ・OS:リナックス ・制限など:習ってるのは配列までです。 ・コンパイラ:gcc という具合です。
よろしくお願いしますって丸投げかよ 宿題スレへ池
for文で〜〜ならば、iaに2を加える という問題なのですが ia=ia++1 では2を加えたことにはならないのでしょうか
なんでia=ia+2;って素直に書けないの?
>856 ia=ia+++1じゃないと式にならん。 >857 中二病なんだろ
っていうか処理系依存じゃ?
処理系依存? ia=ia++1が?
ちくしょーー、プラスがいっこたらんかったんかー
まさかnxtを作っているんじゃあるまいな
すみません 以下の文が分かりません。 .nameみたいに.が付いているのは何の意味ですか? static struct usb_driver hoge_driver = { .name = HOGE_NAME, .id_table = hoge_table, .probe = hoge_probe, .disconnect = hoge_disconnect, };
>>865 C99で導入された指示付き初期化子と呼ばれるもの。
配列の要素や構造体のメンバを初期化するときに、
要素のインデクスやメンバ名を指定して初期値を与えることができる。
a = a++;
が処理系依存なのと同じだな
>>863
どうしても素直に書きたくないならia += ++iaかia+=2でも使ってればいいと思うよ
>>868 ia += ++ia;
ってどうなるのか説明してください
870 :
デフォルトの名無しさん :2007/06/07(木) 08:54:26
自宅でC言語を勉強したいのですが、ぐぐってもいいコンパイラが見つかりません。 突然で恐縮ですが、初心者でも使いやすいコンパイラを教えて頂きたいです。
871 :
デフォルトの名無しさん :2007/06/07(木) 08:59:28
webの検索欄にきときとって入れてみな
>>853 でも、Vista 対応って言うと限られてくるんじゃないの?
ググってもなかなか難しいぞ。
>>870 コンパイラなんて使い出せばどれも一緒
使いやすい、だけなら全部お勧め
Visual C++ Express使っとけ
>>870 >いいコンパイラ
の基準が何なのか知らないが、やる気がないならやめとけ。
for(carry = 2; carry != 0; ) { int tmp = ia & carry; ia ^= carry; carry = tmp << 1; }
Keep It Simple, Stupid!
と言うわけで複合代入演算子がベストってことだね☆
>>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
882 :
881 :2007/06/07(木) 12:55:39
「食べ物」と「動物」の表現が逆になってるな...。
881読んでて感じたんだけど、forのインクリメント部を後置(i++)で書く俺は少数派?
884 :
881 :2007/06/07(木) 13:12:52
C使いだとそうでもないかな。 C++つかっているとプリインクリメント使う癖が...
入門書とかだと後置の方が多くない?
C は後置が多い。 C++ は前置が多い。 C++ 使いが C を使うと前置になる事も。 C++ で前置が多い理由は演算子オーバーロードとの関係。
じゃあCならループごとに交互に使ったり気分しだいで使い分けても問題ないって事?
888 :
881 :2007/06/07(木) 13:40:57
>>887 問題はないけど、どちらかに統一しておくが吉。
「C++」 なのに前置が多いとはこれ如何に
890 :
881 :2007/06/07(木) 13:43:58
でも、ポインタだと *(p++) , *(++p) みたいに結果が異なる場合もあるので注意したほうがいい。
そういう式は書かないようにする プログラミングスタイルにしてるし。
void f(const int* v, unsigned int num) { unsigned int i = 0; while (i < num) printf("v[%d] = %d\n", i++, *(v++)); return; } こういうことか 駄目なスタイルの典型でゴメスだけど
*(p++)の括弧嫌いだな・・・
優先順位わかってませんって言ってるようなもんだからな。
優先順位分かってても、 敢えてカッコ付けることは良くある話。
レベルが様々な職業マの現場では、そうですね。
a && b || c && d でカッコが要らないの分かってても 敢えて (a && b) || (c && d) と書く俺。
>>866 ありがとうございました。
ある構造体に含まれるメンバのうち
特定のメンバだけ明示的に初期化したいときに使うのですね。
>>893 >>894 あちゃー、こういう場合は慣用句的に()とっちゃった方が良いんですか><
じゃあ*とインクリメントの組み合わせとかの場合は括弧取って書くようにしますね><
そんな事より関数の引数評価の順番に依存する様な書き方を控えた方が 今回の場合問題ないけど
問題ないならいいってことじゃ
演算子の優先順位なんて覚えてないよ、書くときには。 読むときには思い出す。
まあ a = 3 + (b * 2); とかじゃなきゃ許す
>>899 C言語は、特にポインタ使うととても自由度のある書き方が出来る言語だから
慣用句的な部分は作法として真似ておかないと
互いに互いのコードが読み辛くなるから、 そこらへんは妥協しておいてね。
俺は過去コードレビューで hoge = *p++ はわかりにくいと指摘され hoge = *p; p++; と修正した記憶があるな 個人的にはどっちでもいいだろと思ったけど 万人にわかりやすいのは後者だな
Cだったら前者、ポインタと*演算子の組み合わせを括弧なしで表現するはありだと思う。
*p++ は慣用句だからまあ分かりにくいことは無いけど、 俺は使わないようにしてる。 というか、インデックス使って書く場合が多い気がするから、 そもそもこういう状況に遭遇すること自体が少ない。
プログラムは行数で評価?
68000使ってたから、*p++とか馴染みやすかったなぁ。 move.l d0,(a0)+ ; *a0++ = d0 つーか、68000自体がC言語意識した命令セットだから当然なんだけどね。
コーディングスタイルスレ逝け あるのかどうか知らんけどw
探してみたが無いみたい。 あってもどーせ宗教論争になってるだろうなw
913 :
911 :2007/06/08(金) 00:02:55
テラハズカシス><; はい、半角で検索はしませんでした。 orz
できるかどうかじゃなくて、 まさかスレタイが英語だとは思わなかっただけでは。
915 :
デフォルトの名無しさん :2007/06/08(金) 08:37:14
実行結果を印刷したいんですがどうやるんですか?
>>915 環境が判らんので一般論を。
・実行結果をテキストファイルに出力し、印刷機能のあるエディタか何かに代行印刷してもらう。
・印刷ライブラリ或いは印刷機能を含んだツールキットを使う。
myprog > prn
918 :
デフォルトの名無しさん :2007/06/08(金) 10:30:36
>>916 デバッグ開始してこの実行結果を印刷したいんです
>>918 デバッガで印刷。
つーか、環境くらい書け、この抜作。
./a.out | lpr
>・実行結果をテキストファイルに出力し、印刷機能のあるエディタか何かに代行印刷してもらう。 間違っちゃいないが、なんでこうもわかりづらい説明になってしまうんだろうな。コンピュータって
> デバッグ開始してこの実行結果を印刷したい なんて言ってる時点で質問が板違い。
Visual StudioのC++で、 wcstoullを使いたいんですが 自前でつくるしかないんですか? libcのソース参考にすればいいのかな・・・
925 :
923 :2007/06/09(土) 18:53:54
>>924 うん、探したけど見当たらなかったから、聞いた
入力を二つに分けて、_wtoi64で数字にして組み合わせとか
いろいろ考えたけど、バグ入ったらいやっだので、
swscanf_s "%llu" 使うことにした。
本当にC++ならboost::lexical_castでええやんと思う
うっさい禿
>>923 _wcstoui64 は VC6 にはないんだっけ?
>>928 それなんで>924のページに載ってないんだぜ……
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 としたいのですがプログラムを教えてください
933 :
デフォルトの名無しさん :2007/06/12(火) 21:38:58
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; }
scanfに変数を渡す時はアドレス渡し 今のプログラムだと入力されたmat[i][j]の値が示すアドレス(不定)に代入され望む結果にならない、というか落ちる mat[i][j]に代入するならmat[i][j]に示すアドレス&mat[i][j]をscanfに渡してやるべし
>>934 scanf("%f", mat[i][j]);
↓
scanf("%lf", &mat[i][j]);
~~ ~~
937 :
934 :2007/06/19(火) 00:38:04
>>935 やってみたら、ちゃんと入力できました!
しかし、matの各要素が、0.000000になってしまいます。
値が渡されていないのでしょうか…。
よろしければ再度教えていただけませんか?
938 :
934 :2007/06/19(火) 00:39:47
>>935 >>936 失礼しました!
更新押さずに書き込みをしてしまい、
>>936 さんのレスを読んでいませんでした。
>>936 さんの仰るとおりにやってみますと、正常に動きました!
お二方、本当にありがとうございました!
デデッ!これで人に言われるまで気づかない新人の出来上がりデスゥ〜♪
>>939 心の貧しい人だなぁ
(´・ω・)かわいそうに…
人に言われても気づかない、もしくは気づいていても認めないヤツよりはよっぽど上等だが。
>>937 教科書くらいは一冊もっていたほうがいいよ。
思いっきり誤爆したorz
自動配線ツールをCで書こうと思ってるんですけど。 アルゴリズムはmazeをベースで。 書くときに参考になるソースコードとかってどっかに落ちてるものなんでしょうか? アルゴリズム分かっても、書くのが素人なので、どれ位の規模(行数)になるかとか、必要な関数が予想つきません。 おおよその規模とか分かる方がいれば教えてください。お願いします。 サンプルなどがあればと思って質問させていただきました。
>>945 どこまでマルチする気ですか・・・
自動配線て巡回セールスマン問題とか最短経路問題とかの類?
アルゴリズムのmazeってのがわからんのだが、参考になるようなサイトある?
どこに行って聞いても「スレ違い」と言われるので、いろんな所に聞いていこうと思ったんです。 お騒がせしてすいませんでした。 繋ぐ2点の座標と障害物の座標を与えて、その間の経路を求めるプログラムです。 アルゴリズムはそれほど気にしなくて良いです。 あまり知られていないようですね。ご迷惑をおかけしました、失礼します。
ロケールの文字コード取得するのってsetlocale()の返値使うしかないのでしょうか
>947 まず「アルゴリズム 経路探索」で検索して 引っかかったページで解り易そうだと思ったとこ全部読め。 ある程度読んだら、迷路の各マスをノードと考えて解け。以上。 それと… > どこに行って聞いても「スレ違い」と言われるので、いろんな所に聞いていこうと思ったんです。 C言語ならここでも構わんし、言語問わないなら「スレ立てるまでもない」スレとか。 活発なスレでスレ違いにならなさそうなスレ探して1つ書けばいいと思う。 いくつものスレに質問して回るのは嫌がられるぞ。俺も嫌いだ。 巡回してるスレで2つも3つも同じ質問見かけたら答える気なくす。 …答えてるけどな。
って自動配線、だから普通にノードでいいのか。 mazeってあるから勘違いした。
落ちてるソースコードで何とかしようという魂胆が気に食わない。
952 :
947 :2007/06/25(月) 11:04:21
>>949 ありがとうございます。
一つ目書いてスレ違いだったんです。
それは明らかに自分の勘違いだったので、
改めてC言語のスレに書き込んだのですが、やはりスレ違いと言われて。
回答もらえそうな適当なスレ探せないなら、迷惑なだけなので、もうそこで諦めないといけませんでした。
本当にすみませんでした。
>>951 かしこいやつは、落ちてるカリントウですら利用する。
負け組みは毎日デスマやってろw
かしこいやつは床にこぼれているご主人様の白濁液さえありがたく舐め取るというわけだ
956 :
デフォルトの名無しさん :2007/06/26(火) 17:54:33
巡回セールスマン問題をあちこちのスレに聞いて回る 巡回マルチポスト問題児
dllファイルを機能同じで、サイズを大きくするにはどうすれば良いでしょうか。
俺は不要なバイナリデータを埋め込む事で数百MBytesのDLLを作った
尻にゴミつければいいだけじゃん
copy small.dll+huge.bin -b > huge.dll
char *str; fgets(str,100,stdin); これを実行して abcde と入力してエンターを押したら strには abcde\n\0 これが入ってるの?
領域確保してないポインタに文字列突っ込もうとする奴はいつになってもいなくならんな。
これがすぐ近くだからいいけど、離れたら原因不明のバグにw
セキュリティホール満載
VCのデバッグビルドなら0xccccccccでAccess Violationだな。
フフフフ
あるある
アセンブリ(?)みたいに直接メモリいじれたほうが楽そうだな
strtokの関数のman読んだら >これらの関数は絶対に使用しないこと。 と書かれてるんだけど、その理由がイマイチわからない。 誰かこの詳しい理由を教えていただけ無いでしょうか?
その下に何か書いてないのか?
>これらの関数は絶対に使用しないこと。使用する場合は、以下の点に注意すること。 > これらの関数はその最初の引数を変更する。 > これらの関数は const な文字列では使えない。 > 区切り文字自体は失われてしまう。 > strtok() 関数は文字列の解析に静的バッファを用いるので、スレッドセーフでない。これが問題になる場合は strtok_r() を用いること。 いや、これは、バグと言うか、strtokの仕様であって、 気をつけるも何も、これを理解して使うはずだろうし。 他に理由があるのかなって。
ウンコ仕様だから、あんまり使ってくれるなってことだろ
>>971 別に絶対使ったら駄目な関数なんてない
strtokの場合、使い方にクセがある、それとスレッド間の問題
同スレッドだって2つ以上同時にトークン分割できないし
この程度の関数なら、自分で作ればいくらでも安全にできるね。
過去の互換性のために残してあるだけの関数といえるのかもしれない
getsみたいな。
Cの標準関数は今となっては危なっかしいのが多いな。 BCPL系言語はもう死滅したほうがいいのかもしれない
C++ 使えば改善してるよ。
>>980 ライブラリの不備と言語仕様をごっちゃにすんなよ・・・
その言語仕様の尻拭いをするだけのものを作ろうと思っても、 C++ のより使いやすいものは作れんな。
#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型にください
>>984 関数と言うものを勉強しなおして、プロトタイプ宣言も勉強することをお勧めしておきます。
>>986 勉強する気がないなら、お帰りください。
少なくともどういうコードを書いたらどういうエラーが出たのか、
それさえ説明できないようなら人間やめるといいと思います。
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になった
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland エラー E2194: ファイル 'a.c' が見つからない ってでるんです。場所のおき方が悪かったのかなと思って。 マイドキュメントにおいたんですけど。
ファイルを置いた場所にあわせてカレントディレクトリを移動するんだ
マイドキュメントに設定されてるって聞いたんですけど間違いでしょうか?違うなら Q1、最初どこに設定されているんですか? Q2、cd のあとどう書けばマイドキュメントに移動できるんでしょうか?
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 ディレクトリ名にスペースがあればダブルクォーテーションで囲む
ドキュメントに移ったんですが、ファイルが見つからないってなります。プロパティは ・名前 a.c ・ファイルの種類 cファイル ・プログラム notepad あとOSがXPなんですがこのままで大丈夫でしょうか? 馬鹿ですみません
わかりました。名前が違っていたらしいです。 a.c としていたんですが a とやったら上手くいきました ありがとうございました。
a.c → コンパイル → a.obj → リンク → a.exe a.exeを実行するのは、aとだけ打てばいい。 a.exe と打ってもいいけど。
>>989 全部読んだらなんかムカついてきた。
埋めついでに言ってやる。
「お前は、a.cというC言語ソースファイルをコンパイルしたa.exeを実行したかったんだ!」
だから
「a.cが実行できません」とでも書けば、もっとすんなりアドバイスできたんだよ!
「できません」じゃわからんつーの!!!まず主語を書け!!!
,ヘー―-、_ / ,、--―-、 、ノ l / ヽl\Nヽl |6 l ◎. .◎l | l, d、 A ノ/ />→ー-‐爪 / / [= ∞ =] |、 / / [= ハ =] l、 / /|__[= l l =] 、_\ /ミ (| l\_) ̄ ̄〈 \_) ヾミミ/l、/ :l __) /lミl l (,―´ └┬┬‐┬┬┘ . ( ( ト┤ ト┤
,ヘ- ―-/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 ` \(
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。