1 :
デフォルトの名無しさん :
2011/07/19(火) 07:00:19.71
>>1 テンプレに過去スレなんて貼る意味あるの?
見てるやつなんていないだろ。
4 :
デフォルトの名無しさん :2011/07/19(火) 11:20:12.30
リソースファイルが読み込まない、何故でしょうか? 検索しても原因が分からなくて、Cとはちょっと違いますが分かりますか? 【Resource.rc】 #include "Resource.h" //------------------------------------------------------------------------// // [Menu] //------------------------------------------------------------------------// MY_MENU MENU DISCARDABLE BEGIN POPUP "設定", ID_SETTING BEGIN MENUITEM "タイトルに戻る", ID_TITLE MENUITEM "ゲーム終了" ID_EXIT END POPUP "ヘルプ", ID_HELP BEGIN MENUITEM "バージョン情報", ID_VERSION END END 【Resource.h】 #define ID_SETTING 0 #define ID_TITLE 1 #define ID_EXIT 2 #define ID_HELP 3 #define ID_VERSION 4 \Resource.rc(9) : error RC2121 : BEGIN expected in menu \Resource.rc(10) : error RC2122 : unknown menu subtype
windows.hはincludeしてる?
6 :
デフォルトの名無しさん :2011/07/19(火) 11:26:11.29
includeしてないから、ちょっとしてみます
MY_MENUが定義されてないのが原因じゃないの。
8 :
デフォルトの名無しさん :2011/07/19(火) 11:28:17.49
先ほどのResource.hに#include "Inc.h"を読み込ませた結果 【Inc.h】 #include <stdio.h> #include <windows.h> #include <tchar.h> #define __DEBUG__ 1>.\Inc.h(5) : fatal error RC1004: unexpected end of file found 同じようなエラーが出てしまいました エラー場所は#define __DEBUG__なんですが、おかしいですよね?
9 :
リソースが読み込めない人 :2011/07/19(火) 11:31:42.34
>>7 MY_MENU MENU DISCARDABLEでMY_MENUを定義してるんじゃないですか?
勘違いで書いていたら、すいません
rcに余計なもの読ますな
11 :
リソースが読み込めない人 :2011/07/19(火) 11:35:32.21
>>10 rcには、Resource.hしか読み込ませてないのですが
それとも、Resource,hにはwindows.hだけ読み込ませた方がいいのでしょうか?
>>9 Resource.hに
#define MY_MENU 100
とかいるんじゃないの?
13 :
リソースが読み込めない人 :2011/07/19(火) 11:45:43.70
>>12 調べてたら、必要なようでした
1>.\Resource.rc(9) : error RC2121 : BEGIN expected in menu
1>.\Resource.rc(10) : error RC2122 : unknown menu subtype
でも、エラーは消えません…
コードは
>>4 の.rc
エラー場所
POPUP "設定", ID_SETTING
1>.\Resource.rc(9) : error RC2121 : BEGIN expected in menu
BEGIN
1>.\Resource.rc(10) : error RC2122 : unknown menu subtype
Resourerc.hは改善しました
#include <windows.h>
#define MY_MENU 100
#define ID_SETTING 101
#define ID_TITLE 102
#define ID_EXIT 103
#define ID_HELP 104
#define ID_VERSION 105
14 :
リソースが読み込めない人 :2011/07/19(火) 11:53:00.26
すいません、解決しました。 POPUPにdefine定義したのを設定してたのが、ダメでした
>>14 5W1H、何をいつどこで。英語だけど日本語でも基本中の基本だから
>>15 英語でも日本語でもそれを省略するのが粋なんだよ
「粋」ってもともと「やせ我慢してるオレCool!」って意味だろ
わ・・枠・・・
ReadFileとfreadの速度を比べた結果を報告します。 処理内容 : 2Byte×約9000点の読み出しと、各要素をエンディアン反転 計測区間 : メッセージループの隙間を使って繰り返し処理したときの周期 ・freadで一個ずつ : 1.25ms ・freadでまとめて : 0.37ms ・ReadFileで一個ずつ : 8.50ms ・ReadFileでまとめて : 0.38ms 一個(2Byte)ずつ読む場合は、freadのほうが遥かに速かったです。 まとめて読むぶんにはあまり差はありませんでした。 1ファイルが大容量で、freadで読みきれないことがあるので、ReadFileでいきます。 ありがとうございましたm(_ _)m
ビットの並び順のことを「エンディアン」と呼ぶのはどうかと思うが。
msbファースト lsbファースト とかいっても、わからんだろうな?
>>21 >1ファイルが大容量で、freadで読みきれないことがあるので、ReadFileでいきます。
fread()で読み切れないって、2GB超ってこと?
>>21 いまどきの開発環境なら fpos_t は64bit対応してると思うぞ
コンパイルオプションが必要になるかもしれないけど
@Googleマップを開いてください Aルート・乗換案内のAに群馬、Bに台湾と入力してください Bルートの42番を読んでください C笑った人は他のスレで紹介してください。
29 :
デフォルトの名無しさん :2011/07/20(水) 04:36:31.33
ジェットスキーで 782km
>>23 MSBとLSBはどっちがどっちかいつもわからなくなる。
LSB が下位側 って覚えてたが… 原文はこうなのね Least/Most Significant Bit
32 :
デフォルトの名無しさん :2011/07/20(水) 17:41:43.08
よく出てくるほうが MSB 反対側をときどき LSB ということがある
パンティを片手で引っ張り上げてマンコに食い込ませるポーズって何て言うんですかね 検索しようにもうまいキーワードが思いつかないんですが
ならばお前が名付けろ。 そこが始まりになるのだ。
>>33 それ検索できない人がいるから、検索すれば分かりそうな質問多いんだろうな。
キーワードも思いつかないような問題でも、無理やりひねり出してトライを
繰り返せばけっこうキーワードがでてくる。
36 :
デフォルトの名無しさん :2011/07/20(水) 20:06:24.69
fgetsで読み込んだ文字列が ”ほにゃらら ほにゃ ほほほ ふへへ” だったとします。 これをスペースで区切った4つの文字列として格納してくれるような関数はあるでしょうか? ないとすればfor文で回して地道に分けるしかないのでしょうか?
strtok どのみちforは居るが
必ず4つと分かってるなら sscanf で 何個になるか分からないけど、1つづつ切り出したいのなら strtok か for 回し (strtok は連続したスペースを1区切りにしないので 意図とはちょっと違うかもだ
ごめん 嘘書いた strtok はトークンが連続してても、それで1区切りだ 逆のスペース1つで1区切りで連続した場合に相応の空文字列に切り出すのができないんだったか "A[SPC][SPC]B" の場合 "A", "", "", "B" の順に切りだしたい って話
へえー
文字列読み出しは未だに新しい発見があって楽しいw
42 :
デフォルトの名無しさん :2011/07/20(水) 23:01:44.18
ライブラリに振り回されているってことだな、しかもコンパイラに同梱という狭い範囲で C は言語そのもには神を感じる(K&R C でさえ)が、ライブラリは玉石混淆なので 憶えるだけでなく自分の分野においての実用性を論評できるようになるのが急務となる
Cってアレだよね 鍛えれば最強の武器になる初期武器って感じ。
|´・ω・`)y-~~
>>43 初期? 基本武器じゃね?
***->的なポインタープログラムを書けるようになると ラムタ式も無名関数も仮想関数テーブル管理もできるようになるよ!
ワンチップ組込みの世界では 胸張って生きれるよ w
そういえば関数ポインタって実際どんな場面で使うの? とくにメリットを感じないんだが・・・
関数を引数にとる関数(高階関数)を書くときに使う
あぁなるほど
アセンブラを学ぶと、Cでどう書いたら実行速度の速いコードになるかが推測でき、 Cを学ぶと、スクリプト系言語がどう処理してるかが推測できる?
>>49 そんな質問してるやつがそんな理由で初めても下手の横好きになるだけだよ
ちょろっとやっただけじゃあんまり意味はない
アセンブラは高級言語と同じことやるのにやたらめんどくさい、Cはスクリプトに比べてメモリ確保とかやたらめんどくさいぐらいの印象できっと終わる
atexit()
.NETやりたいんですが C++をつかう.netの入門サイトまったくありません C#ならあるんですが、素直にC#やったほうがいいんでしょうか? まったく持って意味わかりません、おしえてください
>>52 解説がさっぱりないのは死ぬほど評判悪いから
C++/CLIはやめといたほうがいい
C#使っとけ
CPUの単一スレッドあたりの性能向上が5年ほど前から鈍化してて、現在は事実上ストップしてると考えても過言ではないと思う。 この状況で、インテルなどのメーカーは、今後はSIMDと多コアの方向でCPU性能を稼ごうとしてるように見える。 今後CPUは、多コアとSIMD方面の性能のみが向上してく状態になると思う。 (将来的にはCPUのSIMDが、GPU並の超並列同時演算ユニットへと進化してくと思う)
UnrealEngine3を使う段階の前にGUIプログラミングやりたいんですが C++でできるGUI開発できるやつは その評判の悪いC++の.NET以外なにがありますか? 教えてください C++でできる資料の多いGUIプログラミング教ええてください
新しいAVX命令セットは256ビットのレジスターで、float型8個を1命令で演算できる。と思う。(できるはず) 1命令でfloat型8個を読み、1命令でfloat型8個を別の8個と乗算し、1命令でfloat型8個をメモリーに書きだす。 たったの3命令。 これと同じ処理を従来のx86の命令のみで行えば、 float8個の読み込みに8命令、float8個の乗算に8命令、float8個の書き出しに8命令で、 合計24命令。 圧倒的じゃないか。
会話が成り立ってねーぞ
UnrealEngine3を使う段階の前にGUIプログラミングやりたいんですが C++でできるGUI開発できるやつは その評判の悪いC++の.NET以外なにがありますか? 教えてください C++でできる資料の多いGUIプログラミング教ええてください
さらにGPUの進化はもっと苛烈で、昨今の最新GPUから見ると、AVXのfloat8個同時すらショボく感じる。 最新のGPUだと1024個の演算を同時に演算してしまうらしい。 (CUDAはまったく触ったことないので詳細は知らないが) 最新のGPUは1命令で1024個のfloatを同時に演算できるようなもの?と思ってる。 (多コアの並列動作なので、AVXのSIMDとはニュアンスが違うけど、結果として) 圧倒的すぎる。 というわけで、GPUの演算ユニットを直接使ってみたいのだけど、どうやればいいのかわかりません。 GPUの機械語に対応してるアセンブラが無いので、専用のバイナリーのライブラリーをリンクして使う…的なことなのでしょうか? そうではなく、直接GPUに命令を出せる機械語を知りたいです。 どこかにいい文献があったら教えてほしいです。
前置きなげーよ
>>58 それ有料っていっただろこら
早くおしえろてください
英語がぼちぼちできるんならQtをすすめるんだがきっとできないんだろうな・・・・・・・
void InitializeComponent(void) { this->SuspendLayout(); // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 12); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(284, 262); this->Name = L"Form1"; this->Text = L"Form1"; this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load); this->ResumeLayout(false); } このthisって何を指してるの?教えてください
どいつこいつもC++, C++, C++ !!!!!!!
CALってなんすかぁ
void InitializeComponent(void) { this->SuspendLayout(); // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 12); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(284, 262); this->Name = L"Form1"; this->Text = L"Form1"; this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load); this->ResumeLayout(false); } このthisって何を指してるの?教えてください
InitializeComponentって関数なのに thisってなにをさしてる? オブジェクトさすんじゃないの? どこにあるのそのthisのもと
まず人に聞くまえに、入門書の最初の章くらい読めよ・・・
>>69 それってCの話でしょ?
なんらかのグローバル変数 this があるんじゃね?
http://codepad.org/hsOQvF6K これ
thisってどれ?
InitializeComponent();ってつかってるみたいだけど
Obj.InitializeComponent();なら
objがthisってわかるけど
InitializeComponent();のままつかってるし意味不明です教えてください
マジレスすると thisっていう構造体ポインタなんじゃね?
C++はスレ違いですよ C++はスレ違いですよ 大事な事なので2回言いました
this->ClientSize = System::Drawing::Size(284, 262); ってやってるから ClientSizeで検索したら System::Windows::Formsって書いてあるからここにあるのかな 代入してるし System::Windows::Forms::Form->clientsizeでいいの? public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクター コードを追加します // } ってあるけど Form1( System::Windows::Forms::Form)が thisになるわけ?教えてください
C++はスレ違いです C++はスレ違いです
79 :
デフォルトの名無しさん :2011/07/21(木) 12:39:06.79
float 型と double 型の違いについて教えてください。 #include <stdio.h> typedef double T; typedef float T; /* witch is better? */ int main() { T sum = 0, max = 0, min = 10000, val; int num = 0; while (scanf(" %f", &val) == 1 && val > 0) { if (max < val) max = val; if (min > val) min = val; sum += val; num++; } printf("入力人数: %d\n", num); if (num > 0) { printf("最大値: %f\n", max); printf("最小値: %f\n", min); printf("平均値: %f\n", sum / num); } return 0; } という内容で変数の型を float か double かで悩んでいます。数値演算のプロの方からアドバイスをいただきたいです。よろしくお願いいたします。
プロじゃないけど常にdouble使ってればいい
メモリの節約や高速化(floatが高速になる環境なら)を考慮しないならdoubleでいいと思うけど
スレチぎみ printf のフォーマット文字列はそれで良いけど scanf のそれは float / double で変えないと危ないぜ
84 :
デフォルトの名無しさん :2011/07/21(木) 14:36:35.38
ふっほっはっ
double型に数字入れさせたいのですが、エラー処理として文字列入った場合、ifとかdo whileで弾きたいのですが、 scanfでdoubleに文字または文字列入れた場合、どのような値が入ってくるのでしょうか? テストパターンとして、main() { double a,b; scanf("%lf%lf",&a,&b); printf("%lf\n%lf",a,b); } というプログラムを用いて、最初の入力で"a"を入力したところ、 a 0.000000 0.000000 となりました。bの入力がすっ飛ばされているのも何故だか教えて下さい。 以上です。もしよろしければご回答下さい。よろしくお願いします
>>86 エラーで読み込めないと"a"がストリームに取り残されるから、&bでも
また"a"を読み込もうとして失敗する。
エラーチェックとかやりたいならfgets(…,….stdin)で行単位で読み込んで
sscanf()とかstrtod()みたいので変換するのが楽。
>>87 なるほど!速攻で回答帰ってきて驚いています。ありがとう
一度読みこんでから、再度doubleの中に突っ込むということですね、盲点でした。やってみます
お世話になりました
関数についてで、戻り値、引数無しの関数を作りたいのですが中々上手く行きません・・・ 例として、 #include<stdio.h> /*プロトタイプ宣言*/ void func1(void) void main (void) { ・ ・ ・ void func1(void); } /*関数の定義*/ void func1(void) { printf("。。。"); } 自分の記憶を頼りに、こんな感じでプログラム作ってるのですが、 多分間違えてると思います。良ければ回答お願いします
#include<stdio.h> /*プロトタイプ宣言*/ void func1(void) void main (void) { ・ ・ ・ func1(void); } /*関数の定義*/ void func1(void) { printf("。。。"); }
>>91 全角空白も使ってるんだから、細かい事いうなよ。
#include<stdio.h>
/*プロトタイプ宣言*/
void func1(void);
void main (void)
{
・
・
・
func1();
}
/*関数の定義*/
void func1(void)
{
printf("。。。");
}
>>93 なるほど。呼び出しの所が違いましたか・・・。
ありがとうございますー!
敢えて言おう。int main()とすべきであると。
むしろ記憶で書くなといいたい。
ゼロ記憶だと書けないぞ。
こーゆーレベルの質問に答えるんだ・・・。
答えて早々に追っ払った方が吉。下手に弄って粘着されると面倒。
100 :
デフォルトの名無しさん :2011/07/21(木) 19:06:30.18
下忍よ、そんなことより深刻な問題に気付いているか?
入門者向けのスレなのに 一体どんなレベルの質問期待してるんすか
C++ってRADの開発向いてますか? そういうIDEと飼ってありますか? 教えてください .NETみてみたんですが .NET C++とか検索してもなんか 入門サイトとか全然のってなくてよくわかりません .NET 入門とか調べると C#がでてくるんですが C#がむいてるんですか? C#は.NETがむいてるんですか???わかりません教えてください C++でできるGUIアプリ開発とかやりたいですがなにがむいてますか? Xcodeみたいにウインドウとかボタンとか自由に配置してやりたいんですが WIN32みたいに変な全部ウインドーコードかいたり リソースエディタとかめんどくさいのやりたくないです C++をやる理由なんですが UnrealEngine3っていうやつC++つかうみたいなんで 教えてください C++でできるXcodeみたいなやつ C++だと.NETはむずかしい C#使えっていわれたんですがホンとですか?? C++でできるGUIのIDEとかそういうのあったら教えてくださいまってます
はらたいらに3000点
106 :
デフォルトの名無しさん :2011/07/21(木) 22:27:09.79
while文を使ってファイルを読みこんで処理を行ってるんですが、 その時どの程度まで処理が終了したかを表示させるようにしようと思ってます。 こんな感じです。 100% ||||||||||||||| ところがwhile文の中に居る時は何も表示されなくて処理が終わる(≒while文を抜ける)と いきなり100%のところまで表示されます。 while文中でprintfの出力がリアルタイムでされてなくて抜けるとまとめて出てくるようです。 何かいい対策はないでしょうか?
fflush()
109 :
デフォルトの名無しさん :2011/07/21(木) 22:46:09.38
>>107 来週ためしてみます。
>>108 1分ぐらいは処理やってます。表示は最後に更新されてる感じです。
改行入れないと内部のバッファに溜まるだけで実際に出力されない場合がある 内部のバッファ分を出力して空にするのがfflush
setvbufとかは使える?
>>111 使えるけど、フラッシュで済ませるべき。
windows7ってクリップボードを管理するソフトって標準でなかったっけ? コピペが面倒でたまらん
114 :
デフォルトの名無しさん :2011/07/22(金) 12:50:12.86
>>113 clipbrd は xp までで vista 以後にはない
>>115 大丈夫なのかそれw
ためしにフリーの入れてみたが意外と捗らんな
これも慣れか・・・
テキストエディタ用のフォントを探してるんですが おすすめあれば教えてください とりあえずゼロに斜線が入っていればOKです
osaka
はたらいたら3000円
>>117 かなり個性的だが、ゆたぽんを使っている。
コーディング用を謳っていて
O,0, 1, l, i, ; : .
などがえらく主張しています。
手書き風なので、ダメな人は全くでしょうけど、
ハマれば見やすいですよ。
121 :
デフォルトの名無しさん :2011/07/22(金) 23:10:20.02
動かすとSegmentationfaultになって落ちちゃうんですが デバッグしようと所々にいろんな変数をprintfで表示させるようにするとちゃんと処理が終わるんです。 こういう現象ってよくあるんでしょうか?入出力関連でエラーが起きててSeg〜になるんでしょうか?
>>121 珍しくないね。
特にポインタが変な場所を指している場合は、printfを入れることで
スタックの状態が変わると、症状が出たり出なかったりする。
とりあえずデバッガ使用をおすすめするが、↑のような場合
デバッグモードだと再現しないことも珍しくない。
valgrindのようなメモリデバッグツールを使うのもひとつの方法
>>121 よくある。キミの質問のレベルから超推理すると、初期化されていない
変数を使っている可能性が高そうだ。
コンパイラの警告レベルを最大にして警告メッセージを全部取り除く。
これと併せて、他の人も言ってるけど、デバッガを使ってみると良い。
>>121 printf がダメなら、ulimit とかでコアを吐かせる設定をして、コアを調べてみると良いですよ
適当にブレークポイント入れるだけでもかなりのヒントになると思うんだがそういう事はしないんだろうか
>>121 良くあるよ
printfは破壊検査だと思ったほうが良い
まともにデバッグしたいなら
非破壊検査が出来るデバッガを使え
131 :
デフォルトの名無しさん :2011/07/23(土) 08:30:56.73
Perlで for ($i=0; $i<10; $i++) { for ($k=0; $k<10; $k++) { $str .= sprintf("%d %d\n",i,k); }} という処理をCで書くとどのようになりますか?
>>131 int i,k;
for (i=0; i<10; i++) {
for (k=0; k<10; k++) {
ここは最終的な$strの最大長を決め打ち出来るか否かで大分変る。
}}
133 :
デフォルトの名無しさん :2011/07/23(土) 09:18:24.41
>>132 $strの最大長は分からないですが要素の数は固定長です
char*の配列をまとめて標準出力に送ってくれる関数があるといいなあ
>>133 > char*の配列をまとめて標準出力に送ってくれる関数があるといいなあ
C++ならある。Cならこんな感じ
// エラー処理は省略
int i,k;
size_t alloced = 0, size = 0, c;
char *p = NULL;
for (i=0; i<10; i++) {
for (k=0; k<10; k++) {
if (alloced < size + 32) {
alloced += 1024;
p = realloc(p, alloced);
}
c = sprintf(p + size, "%d %d\n", i, k);
size += c;
}}
>>134 reallocなんていう便利なものがあったんですね
コードまでつけていただいてありがとうございます
>>131 $str .= sprintf("%d %d\n",i,k);
これエラーにならないか?
なんで?
140 :
デフォルトの名無しさん :2011/07/23(土) 12:58:00.29
それは国家安全保障上の理由で言えない。
デフォルト危機だからな。
C言語初心者です。 Javaで作った課題をC言語に打ち変えろという課題が出たのですが Public static〜.やRandom randなどは何に置き換えたらいいのでしょうか?
>>144 それはどんなのでしょうか…
本当に初心者で右も左もわかりません…
初歩的な質問ですいません。
本に載っていたコードをそのまま書きました。
http://codepad.org/D12a7OzX コンパイルすると
Declaration is not allowed here in function main
Declaration syntax error in function main
Declaration missing ; in function main
Compound statement missing } in function main
とエラーが表示されてしまい
何度も見直したのですが、どう直せばいいのかわからずお手上げです。
コンパイラはBorland C++ 5.5.1使ってます。
int hoge
英語読めないならVC++にしとけ
151 :
143 :2011/07/23(土) 22:57:27.94
>>146 さんありがとうございました。
一応教科書と照らし合わせて読んでみました。
先ほどざっとソースを書いたのですが普段はC言語の初歩を打つだけだったので
JAVA→C言語がやっぱりどう置き換えていいかわかりません…
時間が無くひとまずざっと打ってみただけなので相当問題点があると思いますが
教えていただけると幸いです…
http://codepad.org/L2uwO9sC
>>151 java->c/c++ はつらいと思う‥‥‥。
見た目は似ているけれども、説明するには「余白が足りない。」
153 :
143 :2011/07/23(土) 23:07:11.80
>>152 やっぱりそうなんですか…JAVAの学習自体あまりやってなかったもので
どう手をつけていいのか、教科書を読んでも何を書いてあるのか、まるでさっぱりです。
だからその貼り付けたコードもところどころ
JAVAからのデータをそのまま登用してあったりするんですよね…
154 :
デフォルトの名無しさん :2011/07/23(土) 23:34:47.08
>>143 基本的に this とは何かがわかっていれば、あとはひたすら作業ゲーのくだらん問いだ
おまけで関数ポインタや malloc が出てくるくらい
「this とは何か?」という1つの問いに必要以上の負担をかけているパワハラに後で腹が立つはず
配列もわかってないようだから、 public staticはどうしますか?とか以前に C言語の基礎ぐらい勉強してから来るべき
ブロックせずに、入力が無ければすぐ次の処理に入るようなgetchってありますか? もしくは自分で実装可能でしょうか?実装可能であれば、どんな流れの関数になるでしょうか?
>>156 if(kbhit()) getch();
>>157 ありがとうございます!
windows用のようですが、手がかりにして調べられそうです
>>159 行を見ていくループの変数の初期値もしくはソース側の初期値がおかしいんでしょ
>>161 なるほど初期値ですか。見てみますありがとう
でも途中までおかしいのに途中から正しくなるのが何故かわからないのですが
それは SysReq だ。
普通に「Tフロント 食い込み」だろ。
今オレの右手に自分のうんこが付いてしまっているんだけど どうしたらいいですか?
食え
日付の計算ってどうやればいいですか? 何分何秒まで正確にだしたいです
172 :
デフォルトの名無しさん :2011/07/24(日) 14:03:27.45
時計見ろよwwwwwwwwwww 幼稚園児かよwwwwwwwwwww
>>171 標準ライブラリにあるようなのそのまんま聞かれてもなぁ
少しは調べろよゴミ野郎
174 :
デフォルトの名無しさん :2011/07/24(日) 14:46:16.97
fscanfで読み取った値に+10したのを代入したいけどどうしたらいいの?
>>174 質問の日本語がちょっと変。その部分のソースを晒せ
176 :
デフォルトの名無しさん :2011/07/24(日) 14:53:05.37
>>175 fscanf(data,"%d",val);
val+=10;
178 :
デフォルトの名無しさん :2011/07/24(日) 15:14:41.62
int val; なら fscanf(data,"%d",&val); int *val なら fscanf(data,"%d",val); こう?
>>176 適当に書いてる
#include <stdio.h>
int main(){
FILE *data;
int val;
data= fopen("data.txt", "r+");
if (data == NULL) {
fprintf(stderr,"Can't open\n");
return 0;
}
fscanf(data,"%d",&val);
printf("1:[%d]\n",val);
val+=10;
rewind(data);
fprintf(data,"%d",val);
rewind(data);
fscanf(data,"%d",&val);
printf("2:[%d]\n",val);
fclose(data);
return 0;
}
>>178 付録(val+=10;)があることを誤魔化さないように。
181 :
デフォルトの名無しさん :2011/07/24(日) 18:07:14.29
別フォルダからヘッダーファイルをインクルードしたい場合 毎回フルパス記述しないと駄目なの?
>>182 コンパイラのオプションでヘッダファイルの置いてある場所を指定出来るよ
gcc だったら -I とか
相対パスでいいよ。
指定した行をfscanfで読み取るにはどうしたらいいですか
その行まで読み飛ばす。
187 :
デフォルトの名無しさん :2011/07/24(日) 23:27:56.92
fseekで飛ぶ
ファイルの中身がどうなってるかわかってる?
win32apiのタイマ処理で質問があるんだけど WM_TIMERで処理量を多くして発生間隔を短くした場合 WM_TIMER処理中にWM_TIMERが再度呼ばれてしまって ループするとかあったりする?
ないよ 逆にタイマが遅れて処理されるよ
>>189 メッセージを処理し終わるまで、ほかのメッセージはメッセージキューにたまってるんじゃないの?
192 :
デフォルトの名無しさん :2011/07/25(月) 00:56:14.83
割り込みの発生間隔よりも 割り込みの処理時間がかかるのは 遠かれ近かれいずれ破綻する兆候 ハンドラでしか絶対に無理な処理と ハンドラやらなくても main のコンテキストに委譲できる処理が うまく切り分けられていないとそうなる
なるほどサンクス ひたすらメッセージがキューにたまっていくだけで 多重割り込みにはならないんだね
194 :
デフォルトの名無しさん :2011/07/25(月) 01:39:41.84
#include <stdio.h> typedef struct tagDATA_ST { char cData[4]; unsigned int iData; unsigned short sData0; short sData1; } DATA_ST; int main( void ) { DATA_ST data; int* pPtr = ( int* )&data; } 質問があります。 上記みたいに、構造体のアドレスをint型のポインタにキャストした場合 pPtrはどこの領域を指し示すのでしょうか?
普通にキャストしてるだけなんだから、 data.cData[0] だろ?
>>194 位置は、ポインタに代入されたアドレス。
位置をいじるとき(ポインタ演算)、キャストした型のサイズが影響。
struct D {char c[256];}
D d;みたいなとき、
char *p = (char *)&d; // p[0]→d.c[0], p[1] = d.c[1]
int *q = (int *)&d; // q[0]→d.c[0], q[1] = d.c[4]
間違ってたらごめんw
>>195-196 ありがとうございます!
>位置をいじるとき(ポインタ演算)、キャストした型のサイズが影響。
始めて知りました。勉強になります!
>int *q = (int *)&d; // q[0]→d.c[0], q[1] = d.c[4] 「16bit環境だと(ry」と重箱の隅を(ry
× タイマ ○ タイマー
そう考えていた時期が俺にもありました
複数のファイル読み込む場合 ファイルポインタの宣言はひとつで fopenを何度も使えばいいの?
>>201 fclose しないと同時に fopen できる数の限界突破して fopen に失敗するようになるかも
いいってことよ。
サーティファイのC言語能力検定の難易度と社会での認知度ってどんなもんなの?
引きこもりだからワカンネ
漢字検定の法がマシなレベル
モンテカルロ法を使って円周率を求めるものなんですが指定されたプログラム(下に載せました)に (1)全試行回数と結果を表示する間隔をscanf()で読みそれにしたがって処理が進むようにする。 (2)各途中経過で求めたπの近似値のうち最もπの真値(=3.14159)に近い値とその時の試行回数を最後に表示させる。 という2つの点を加えて改良しなければならないのですがどなたか教えていただけませんか?
#include<stdio.h> #include<stdlib.h> int main(){ int i,CircleCount=0; float x,y; for(i=1;i<=100000;i++){ x=(double)rand()/(double)0x7fff; y=(double)rand()/(double)0x7fff; if(x*x+y*y<=1.0) CircleCount++; if(i%10000==0) printf(“%7d回 n=%f\n”,i,4.0*CircleCount/(float)i); } return(0); }
RAND_MAXが0x7fffじゃなかったらどうすんだよw
すみません。 載せたプログラムは先生の方から送られてきたものを 丸写ししたもので初心者なんで どこがおかしいとか言われても分からない点が多いです。
ああこれから変更しろってことね
すみません。 言葉が足りていませんでした。 上の2点を加えて改良しなさい という課題でした。
つか、モンテカルロ法とかいうけど、そんなん関係ないじゃん・・・
乱数使って計算するのがモンテカルロ法だろ
>>214 まず100000のところを変数にかえて
その変数はscanfで
>>214 >>215 c言語得意な友人も同じ事ようなことを言ってましたが
先生いわく
「授業でやった範囲内で」
との事らしいです。
その友達もかなり苦労してるみたいです。
>>218 10000のところ変数にかえて
その変数はscanfで
>>217 とあわせて(1)終わり
scanfはあかんで。getc使えや。
(1)はできました! (2)はどうすればいいのでしょうか
223 :
デフォルトの名無しさん :2011/07/25(月) 22:44:41.03
(2)も頑張ってみる
πとの差の絶対値を取って比較して小さいほうを残す
ホントに初心者なので アドバイス、というよりもソースプログラムを 書いていただけると助かります。 質問スレのほうでは 長すぎるのでリンクを使って貼ろうとしたら なぜかリンク先に飛ぼうとするとエラーになってしまってちゃんと質問できません。 ヨロシクお願いします。
中学生みたいなこと言っていい?
227 :
デフォルトの名無しさん :2011/07/25(月) 23:06:14.89
やりてーって?
228 :
デフォルトの名無しさん :2011/07/25(月) 23:12:12.26
まじきしょいし笑
229 :
デフォルトの名無しさん :2011/07/25(月) 23:21:34.57
この前C++入門書買って来て、プログラミングに挑戦しました。 出てくる文字列が、記号と、数字と、アルファベットだけなので、想像していた以上に簡単でした。 自分で書いたソースコードをコンパイルして、実行形式のアプリにするって面白いですね。 簡単なゲームソフトぐらいは作れるレベルになりたいと思う。
>>230 主にifの中身の意味が理解できていません。
>if(fu>=1 && jimen[fu-1]>=4){
もしも踏んだ数が1より大きいまたは等しく、
かつ、配列のうちの1つ踏んだ部分を消して、それが小さければ4?と
段々意味が解らなくなってきてしまいます、どなたかお願いします…
linuxのカーネルソースを読んでたら change_huge_pmd() のような、ありがちな名前の関数が、staticも付けずに宣言されてたりする。 static を付けずに関数を宣言したら、 以後、どんなことをしても、 リンクされる全てのソースコードへ名前のスコープが通ってしまうのを防止できないかと思ってたのだが、 違うのだろうか? こんな単純な名前が、数百万行のソースコードで、一度も被らないのが不思議でならない。 なにか、公開を一部のソースだけに限定する方法でもあるのですか?
>>231 fu>=1 : fuが1以上
&& : かつ
jimen[fu-1]>=4 : jimen[fu-1]が4以上
>>233 ありがとうございます
jimen[fu-1] の部分も実はよく解ってないのですが
これはどういう事なんでしょうか?
配列が10個に設定してあるので配列が1個減るよみたいな感じなんでしょうか
>>235 すいませんhogeを見たことがないのですが
どう解釈したらよろしいでしょうか…本当に知識が無くて申し訳ないです
一度基礎からやり直さないと 行き当たりばったりでやっていても身につかないよ
いや、プログラミングに向いてないと思うんだ。 時間のムダだから他のことやったほうがいいよ。
プログラミングに向き不向きもねーよカス
正直私も自分で向いてないなと思うしやりたくないんですが 学生なもので…再試に向けて学習していたところでした…
釣りだろ
1,000行くらいコードを書けば見えてくる物はあるし、 3,000行くらい書けば分かってくる事もある 10,000行くらい書けば、多分独りで何とか出来る様になる
>>235 配列の何番目の要素を使うかを[]内で指定している
例えばfuに3が入っていたらfu-1は2になり、
インデックスは0から始まるので、配列の3番目の要素って意味になる。
>>244 なるほど、ぼんやりとですが理解できました。
例文どおり行けば3番目の要素になるということはわかりましたが
その後の>=4というのは
3番目の要素と4が等しい?ということですか?
>= は ≧ と同じ意味。 <= は ≦ と同じ意味。
以上以下ということでしょうか
算数からやり直したほうが...
単位を諦めろ。
ここまで釣り。
ソケットで、TCPポートからUDPポートをぶち開ける方法を教えてください
どこでもお好きなポートをどうぞ。ただしやさしくお願いします。
情報系の高校生だけど C言語できたらモテますか 友人のバンドマン超えられますか?
モテません。超えられません。またどうぞ。
全てを否定しておきながら また来いだと・・・ ぬかしおる・・・
>>253 卒業までにOSか言語か高機能テキストエディタを作って、
フリーで公開し、みんなが使ってくれたら、高校生のうちにモテるよ。絶対だよ。
携帯アプリのほうが盛り上がるだろ
学校みんながあつまれるサイトとかのがいいんじゃね?
日本版facebook?
>>255 まさか、「またどうぞ」って「またどうぞお越しください」って意味だと思ってたりしないよな。
みんな思ってるよ
ぶぶ漬け食べはります?
大盛りでもらおうか
あぁ、ついでに氷もたのむ
>>256 エディター, 言語, OS
どれも誰もが一度は夢見る分野だ‥‥‥。
自分は、エディタ、コンパイラ、GUI ライブラリだったな OS はドライバを用意するのが面倒くさそうなんで、心惹かれなかった
すでにあるモノつくたって意味ない。ないモノつくれ、ないモノ。
プログラマにとっては意味があるんだよ
俺はprintfを極める。
OSをゼロから作ったら面白いと思うけどな。 一切の予備知識無しに。独自進化の面白さがモロに出る。
一般にosを作るっていうのは カーネルから作るの?
カーネルからというか、カーネルを作るのでしょう ブートローダから作って、スケジューラ、仮想メモリ、デバイスドライバ、 ファイルシステム、ネットワークプロトコルスタック、その他細々と沢山 俺は無理
俺はブートローダ、スケジューラ、仮想メモリ(の枠組み)まで作って次デバドラ作ろうと思ったけどハードウェアの資料が見つからなくて諦めた
274 :
デフォルトの名無しさん :2011/07/26(火) 22:56:28.92
>>270 それなくして、他に何が残るのか
というくらい自らの存在意義をありありと感じられるところだからな
MVS や Multics や CP/M の流れをくまない独自の世界が
偉大だろうがショボかろうが歴史に骨を残す何かをしてる
ときには多値化やアナログ、有機物性やハイエナジーに
超高速不揮発性次世代ストレージと、おもしろいネタにはことかかない
生きた証ってのは「この手で」残すものだろ
ほんとにOSを学びたいなら、CPUとメモリ、デコーダーから作るべきだと思うんだ・・・
仮想マシンを作るのは愉しそうだな
>>274 その生きた証を残せる逸材が、
地球上で一握りしか出てこない(ヽ´ω`)
ちょっくらシリコンバレー行ってくるわ
ぁ、バカフリでシリコンバレーの見分け方やるみたい・・・
スレチならごめん。 プログラミング経験のない人にC言語を教えているんだが, 最初に難しいと感じるのは,「演算子」の使い方なんだろうか? よくある問題(プログラミングの問題)を解くのに、 「演算子を組み合わせてうまく使うこと」が結びついていないことがネックだと思うんだけど, どうだろうか?当たり前と言われればそれまでだけど… わからない感覚を教えていただけると嬉しい.
代入あたりは、馴染みがないのかもしれん。 C以外でも、何かプログラミング言語をやってりゃ馴染んでるだろうけど。
なるほど. でも代入は何回かやってるうちに慣れてくる印象. それよりも,if文の中の判定とかの書き方を思いつかない場合のほうが多そう だなぁと思っているんだけど,どうだろうか? (そもそも,if文で分岐するっていう発想ができない人もいるけどマレ)
>>283 ifの判定というか、条件の記述はいまだに自信を失うときがあるw
ある角度をある範囲にクランプさせるふうに条件をかいたつもりが、
なんどやってもうまくいかなかったことがあるw
以上、以下を組み合わせてつかうだけのことでも、場合によっては混乱を来たす。
malloc.hをインクルードしてるのに、 _get_amblksiz関数が定義されてないってエラーがでます。 この関数はもう存在しないのでしょうか
>>284 初心者相手なんで,そんな条件が複雑になることはないw
実際に開発となればテストケース書けば良いことなので…
今回の場合,高々複雑といっても,
「入力された数が4の倍数と5の倍数又は3の場合に数を表示せよ」そういった類の問題です.
例えば,
〜の倍数 と言われてどう書けばいいかわからないとか
条件が複数出てくる場合には || や && を使わなかったり
こういうのが最初につまずくポイントかなぁと思うんですけど,どうだろ?
(||とか&&とかを組み立てたり,〜の倍数という条件文を考える所が)
> 〜の倍数という条件文を考える所が あーはいはい。なるほど。そういうのある気がするし、 俺自体も何十年も前にそれを体験したような気もする。
>>288 やっぱそうですよねw
そこの点で,
「何年も、何十年も前に体験した」ので,初心者が「何で」わからないのか
わからないみたいな状態です.そこで,知恵を貸していただきたいなと思ってます.
何で分からないかに答えることは難しい。 /と%の意味を先に教えておいたなら、 各自の応用力(想像力)に任せるか、 先にもうイディオムとして教えちゃうかだろうし、 何で分からないかと問われれば、 応用できない、応用しにくい、基本が疎か、 せんせーがイディオムを教えてくれてない! とかかな。 あとはやっぱり実物を触ってるかどうかも大きい。 実際に自由に工夫をしたり確認したりすることなしに、 理屈だけでものごとを考え、延長させていくことはたぶん不慣れなはず。
お答え,ありがとうございます. 応用できる土台を作る為に,演算子に注目して問題を作ればいいのではないかと 思っているのですが,どう思いますか? int main(void)とかprintfとかをわざわざ書かなくても演算子にだけ注目 して問題をとかせるのがいいかなぁと思っていて… 例えば, int i = 10; i%2 はいくつになりますか? i%5 はいくつになりますか? のような問題が効果的な気がするのですが,どうでしょうか?
算数習ってない幼稚園児にでも教えてんのか?
ぶっちゃけその程度のことも思いつかないような人はセンスが無いから適当にあしらえばいい
むしろ、こんな教え方の人に習ったら不幸だな。俺ならK&Rを嫁!という。
そんな時代遅れな本を読まされる方がよっぽど不幸だろ それもmodの発想すら頭にないような奴に
ひたすらコード書かせて、コンパイルして実行させる
時代遅れな本ってw だったら、そもそもCを教えるなよww
いるよなーこうやってK&Rに固執する奴
じゃぁ、お前の言う、はじめてCを習う人にうってつけの 時代の最先端をいく本とやらをあげてもらおうか?
入門書なんてそんなに書いてあることに違いは無いんだから、なんならネットから適当に拾ってきてもいいんじゃね ただ、K&RはC言語に慣れた人ならともかく、初心者が読むもんではないだろ いわんや初心者未満の者をや
K&RはC入門者にはともかくとして、 プログラミング言語の入門者には向かない 見事なまでに簡潔すぎる かつては他に選択肢がないという理由で 使われていたこともあったらしいけどさ
おすすめの入門書は猫でもわかるC言語 C言語を学ぶ上では避けて通れない名著だね
>>291 です.
皆様(
>>292-303 )レスありがとうございます.
できるやつは手が自然に動く→勝手にできるようになるのでほっといてもいいと思います.
でも,やっぱりできない人もいるのでそういう人は「センスがないから諦めろ!」でいいんでしょうか?
個人的には,効率的な学習法があればもう少しは「わからない」→「わかる」に
できると思っているんですが…
本はたしかに大事ですが,結局読む苦労があるので,ツールかなにかで支援できたら
嬉しいかなぁと思っています.(手を動かしながら自然に理解するという事)
>>302 マイクロソフトのSmallBasicは初耳ですね.
ありがとうございます.初心者にとってどういった点がよく出来ているのでしょうか?
>>296 がいいこと言った!
トライアンドエラーの中で、コンパイラ、実行結果と対話して理解を深めていくんですよね。
>「センスがないから諦めろ!」でいいんでしょうか? いいんです。必要なら、出来る人にお金を払ってやってもらえばいいんです。 世の中、そーゆーもんです。
PGは安いしな 小金でこき使うのがベスト
スレ違いになるけど、表計算ソフトでも触らせたら? 制御構造はない代わりに、セルを参照する計算式を幾らでも記述できるから 話題に出ていた除算や剰余、条件判断なんかを全部こなせるぞ。 おまけに、そこにある数値を使ってその場で計算できるからテストケースも作り易い。
BASICで 「”●”をテンキーで操作するプログラムを作れ」 の方が入門基礎知識身につきそう。
環境依存になりそう
>>305 ごもっともです.
>>306 やめちまえとは言えない立場なのでごめんなさい.
>>308 なるほど!たしかに良いアイディアです!
基本的な演算子構造は学べますね.
ただ,Excelやった後にプログラミングに入ると
順次実行するという感覚がイマイチ身につかない様です…
>>309 なぜBASICなんでしょうか?
もう、VBAでいいじゃん。 分かりやすいし、開発環境ほぼ無料みたいなもんだし 慣れりゃゲームでもネットワーク関係でもなんでも作れるし 言語的にもしっかりできてるしな
>>311 どっかのセルに=indirect(address(row()-1;column()))+1とでも入れて、
縦方向に並べる。
これの一つのセルの計算を、何列も並べる代わりに回数を指定したのがループ。
この説明で中坊の甥っ子は納得したぞ。
まぁ、マインドストーム知ってたけど。
>311
>
>>309 >なぜBASICなんでしょうか?
「BASICを学べ」、と言う訳ではなく、
「BASICを使ってプログラムの基礎」を学べということで。
HelloWorld例
BASIC
10 PRINT "Hello World."
C言語
#include<stdio.h>
int main(void)
{
printf("Hello World.\n");
return 0;
}
大学でC始めたばかりの頃、先頭の#includや int main(void)の意味がわからず、
のどに何かつっかえたままやらされて、気分が悪かった。
訳の判らないまま勉強しても身に付かない。
Cと比べてBASICの方が記述量が少ないから理解し安いかなと思って書いた。
あと学ぶなら面白いプログラム、自分なら画面に動きのあるプログラムの方が書いてて楽しかった。
Cだと画面描画はライブラリそろえないとろくなことできないけど、
BASICはそういう命令が最初からそろってるので向いてると思った。
まぁ、いまさらBASIC勉強させられても…とは思うけど。
それはお前がアホだから
アホにプログラムを教える話じゃないのか?
CのスレでBASIC先にやれとか、頭おかしいだろw 先にやるならアセンブリに決まってる
「俺がやった学習順が一番正しい!!キリッ!!」
キリッ!!(キリッ
大学じゃC言語の前にPASCALやったけど、役に立ったとは思えなかった。 はじめてのC(どこの出版かは忘れた)、データー構造とアルゴリズム、C言語の非常識、Cからアセンブラの利用方法書いてあった本、 これらで基本的なことは学んだ。
アセンブラなんか勉強して意味あるのかねぇ パイプラインやらサイクルやらレジスタ演算やら覚えた所で今時意味がないじゃん 逆に意味不明なプライドと思想が付いて、スパゲティプログラマになりそうだ
>>322 学ぶ意味はあるだろうけどアセンブラから学ぶ必要性があるかは分からん
スクリプト言語からでもいいじゃん。
英語がおすすめ
BASIC先にやっておくメリット。 ・ポケコンやDSで動かせるので初期投資が小さい ・言語仕様が素朴で小さく理解しやすい ・行番号とGOTOという非構造化の不便さを学べる
このスレでやんな氏ね
DSで動くんか、と探したらスマイルブームか、、、 ちょっと買ってみようかなあ
329 :
デフォルトの名無しさん :2011/07/27(水) 18:47:41.68
>>326 はい、ダウト
行番号や GOTO 君と仲良くなると
お別れがつらくなり
本当は GOTO 君きらいじゃないのに
世論に流されて自らに嘘をつくという
プログラマである前に人間として恥ずべきことをするようになる
アルゴリズム本(データ操作な話から 数値解析や AI等)の説明で 使われる言語が C (もしくはそれに近いメタ言語)が多いんじゃないかな?と思う
別に推奨してる訳じゃないのに書いてない部分に突っ込みいれてダウトってwwww
332 :
デフォルトの名無しさん :2011/07/27(水) 19:08:19.89
>>331 =326
> BASIC先にやっておくメリット。
ここで推奨し、
> ・行番号とGOTOという非構造化の不便さを学べる
ここで理由付けしてるだろ
俺はその理由に異論があるので
おまえ自身が「非構造化の不便さ」を学んでいなさそうなことに突っ込んだんだよ
行番号と GOTO の何が悪いんだ? 話はそれからだ
333 :
デフォルトの名無しさん :2011/07/27(水) 19:12:35.74
MFCでマルチスレッドを使ったアプリを開発してます。 大きなファイルを読み込むときにアプリがフリーズしてしまうので、その防止です。 単一のファイルなら問題ないのですが、複数のファイルを読み込むときクリティカルエラーが出ます。 Expression("Buffer too small",0) アプリを終了させないで続けて読み込もうとするときにも出ます。 どのような可能性があるのか教えて下さい。必要ならソースも見せます。 よろしくお願いします。
非同期読み込みで解決
335 :
デフォルトの名無しさん :2011/07/27(水) 19:44:00.19
それだけでいいのですか?エラーの解消になりますか? ちなみにドラッグアンドドロップにしてあります。
>> BASIC先にやっておくメリット。 > >ここで推奨し、 どんな物にもメリットはあると思う。 そのメリットを書いただけで推奨だと言うのは強引だろ。 GOTO云々はよくわからん。
>>335 バグってるから死ぬの
デバッグしろとしか言いようがない
誰かデバッグしてください、ってんなら現象が再現するソースを出して
俺はしないけどしてくれる奇特な人がいるかもしれない
シンプルで素朴な手段としては、ファイルの読み込み完了を示すフラグを用意して /// tt_file_io.c tt_read_fire() { tt_compleate_flag = FALSE; fopen(); while() { fread(); } tt_compleate_flag = TRUE; } として、利用する際にスピンロックで待機する方法はどうか /// tt_a.c tt_read_fire(); while(tt_compleate_flag == FALSE) { sleep(250Hz); } とすれば、これらが別スレッドで動いてても、単一スレッドで動かしてるかのように同期をとれるはず。 これをウインドウズの場合にどう書けばいいのかは知らない。
339 :
デフォルトの名無しさん :2011/07/27(水) 20:17:21.11
>>336 =331=326
デメリット説明をしない悪徳業者だな、まるで
> ・行番号とGOTOという非構造化の不便さを学べる
> GOTO云々はよくわからん。
破綻は確認できたので、この旨のみの報告はいらない
340 :
デフォルトの名無しさん :2011/07/27(水) 20:20:40.49
これは335に対する回答ですか?>338
そもそもMFCって C++ベースなんじゃ? なんでこのスレに書いたのか疑問
342 :
デフォルトの名無しさん :2011/07/27(水) 20:29:35.20
元々Cで書いてあったソースにVSでグラフィック化したので元のモジュール(スレッドで実行する)関数はC言語なのです。
>>342 ふむ。 問題を起こす可能性の範囲が広すぎだ。
GUI化せず 非MFCでマルチスレッドのコード書いて問題の範囲を制限汁
344 :
デフォルトの名無しさん :2011/07/27(水) 20:45:17.41
スレッド使ったときのみの現象です。 単一スレッドしか作ってないので複数スレッドを作らないと複数のファイルやフォルダに 対応できずエラーが起きるのではないかと思っていますがどうでしょうか? Win32APIは全く知りません。
Socket通信で、client側も自ポートを指定したいんですが、普通はどんな風にするんでしょう? 取り合えずbindして自ポートを指定して、それからconnectしてみましたが、なんか素直じゃないような気がしてます。 Connectする前にキャストしながら色々設定する時に、自ポートを指定出来たら良いのになと思うんですが、どこかにサンプルありませんか? Cで作ってます。
スレッドがどういう役割分担なのかが不明なので憶測だけど A:ファイルをロードし、メモリー確保してメモリーに読み込んで、そのメモリーアドレスをリターン B:Aから返ってきたアドレスを介して、データを利用する 上記のAがウインドウズ側スレッドの担当で、自作モジュール側スレッドの担当がBなのだと予想。 Aはメモリー確保予定のアドレスを即座にリターンして、実際の作業はBに並行して行われるのだとしたら、 Bは、まだ実際には確保されてないメモリーに対して読み書きしてる状態になる可能性があるかもしれない。 だとすれば、BはAの作業が完了までメモリーの利用を待つ形にしたらどうだろうかと思った。 ウインドウズは持ってないので知らないけど、すぐ返ってバックグラウンドで読み込みしてるのをポーリングで 確認するような仕様だったとすれば、この辺な気がする。 もしくは全然別の理由かもしれないけど、いずれにしてもファイル読み込み側と、利用側とのデータ利用順序が、逆転してしまってる場合にエラーが出るような気がする。 スレッド使った場合のみエラーが出るあたりからして、この系統の理由な気がする。
Win32を知らなくてもマルチスレッドのプログラミング技法を 知っていれば問題ない。 マルチスレッドのプログラミング技法を知らないなら、諦めろ とか、出来る人に金払ってやってもらえとしか言えない。
349 :
デフォルトの名無しさん :2011/07/27(水) 22:03:50.58
>>347 処理系依存否定教に汚染されてるとそうなるな
Win32 なら Win32 でいいから具体例を触ってみなけりゃまるっきり話にならない
その「出来る人」なら知らないわけがないことだが
>>311 です.
みなさまご教示ありがとうございました.
いいアイディアをもらったので色々また自分なりに練り直したいと思います.
351 :
デフォルトの名無しさん :2011/07/27(水) 22:17:52.49
実行ファイルってそこから元のソースファイルを読むのって不可能ですよね? つまり、 { int a=100; printf("AHAHA"); return 0; } の場合 「a」 の存在は作成者しか知りえませんよね?
352 :
デフォルトの名無しさん :2011/07/27(水) 22:22:34.53
AfxBeginthreadでワーカースレッドを呼び出して、そこで読み込みを行っています。 同期とかは取ってないので先に終了メッセージが出てしまいます。 プログラムを見せたら原因がわかるでしょうか?同期も非同期もしてません。 それに作ったスレッドも正しく終了してません。ファイルごとに新しく スレッドを作るべきなんでしょうか? よろしくお願いします。
353 :
デフォルトの名無しさん :2011/07/27(水) 22:28:16.34
ファイル一個の場合はエラーが出ません
スレッドセーフな関数じゃないというオチだろう(おおよそ static 変数使ってる)
357 :
デフォルトの名無しさん :2011/07/27(水) 23:27:13.77
最適化でエリミネートされている可能性大
358 :
デフォルトの名無しさん :2011/07/27(水) 23:28:38.22
サブディれとりにあるファイルを一括処理できるのに、カレントディレクトリにある複数ファイルを指定するとエラーになります。
普通にコンパイルしたら動くのに exeファイルにビットマップを埋め込もうとリソースをリンクすると access violationが出るんだけどなんなんだろこれ・・・
C言語始めたばかりです。 以前COBOLを扱っていました。 C言語をある程度使える、 と、面接で言えるには どのくらいのレベルが必要ですか?
開発実績がある = ある程度使える と解釈されます。
363 :
デフォルトの名無しさん :2011/07/28(木) 07:58:39.17
とりわけ COBOL 屋なら
>>362 に突っ込めるだろ
そこは C でも変わらないよ
そこってどこですか?
突っ込める?
ケツは勘弁してください
ここはGMP(多倍長計算ライブラリ)の質問も可ですか?
もちろん
369 :
デフォルトの名無しさん :2011/07/28(木) 15:24:08.78
GMPより巨大整数を使うならNTLがおすすめ
370 :
デフォルトの名無しさん :2011/07/28(木) 15:27:12.95
いまいち理解できないソースがあるので教えてください 整数a=配列b[添字]-'0'; このさいごの配列に対して引いてるのはどういう意味なんでしょうか? ゼロじゃなさそうですが上手いことググれないので助けてください… 配列からゼロという文字を引く…みたいになってますが…
'0'は48だよ
372 :
デフォルトの名無しさん :2011/07/28(木) 15:32:31.81
マルチスレッドは初心者のプログラムじゃないって書いてあったんですけどここでもいいですか? 初心者です。
atoiでも自作してるのか
文字コードにも依存するが 文字としての'0'〜'9'から 文字としての'0'を減算してやることで 値としての0〜9に変換できる
ズコーですな
図工ですね
>>374 文字コードに関わらず動作することが保証されている。
しねーよカス
0から9まで隙間なく並んでる前提だな。 パンチカード前提で飛び飛びになってる EBCDICも数字部分はたまたま並んではいるが・・・
380 :
デフォルトの名無しさん :2011/07/28(木) 16:15:03.69
ありがとうございます つまり、配列から引くことで文字列から数値に直してから、整数型の変数にぶち込んでいるということですね
たまたまじゃないよ規格読め
たまたまあってたから、今後は抜けが無いように 後から規格作ったんだよw
文字コード規格の規格とかあるんかな?
0〜9って文字コード上でも並んでなければならないって決まってるの?
無い 俺俺文字コードでも文字コードにはかわりない 数字が連続になってない文字コードを作ってもよい
unsigned整数の最大値をインクリメントした時って未定義?
2以上の整数x,yを順に入力し, y/xが以下の条件のうちどれかを満たすまで計算するプログラムを作る 1.割り切れる 2.循環する 3.整数部も含め30桁まで出力 ただし,xは2以上,yは0以上でなければならず,この条件を満たすまで再度入力させること.小数点は1桁として扱わない.また,x=2,y=4のときのように,xがyの約数であるときは整数部のみ出力し,小数点を出力してはならない. 使うのは #inculude<stdio.h> のみ っていう条件なんですがさっぱりわかりません、分かる方ヒントください
1/3は0.3って表示すんの?それとも0.33?
>384 C言語で使うんなら必須。 JIS X3010 : 2003 プログラム言語C 5.2.1 から抜粋 ソース基本文字集合および実行基本文字集合の双方において、10進数字に関する上の並びにおいて、 0の右側に並んでいる各文字の値は、一つ左側にある文字の値に比べ1だけ大きくなければならない。
計算するのは循環するまでで、表示は 0.33333333333333333333333333333(整数部も含め30桁) じゃない?
win32apiでリソースとして埋め込んだビットマップを利用する場合 LoadBitmapで呼び出したのでいいの? いま作ってるプログラムは一応LoadBitmapで動いてるけど 猫でも分かる〜のサイト見てるとFindResourceやら LoadResourceやら使ってビットマップ呼び出してるから どっちが正しいのか良く分からない;
>>387 これって、さっとできる初心者向けの問題なの?
さっと解く方法が思いつかなくて1桁1桁計算しようとしたらかなり面倒だった
循環の判定以外は、小学生時代に習った割り算のやり方で十分だろ
xの桁数が大きいと厄介だぞ。 割り算のあまりを覚えておく方法だと、循環する分だけ覚えておく必要があるから 結局30個分のあまりを覚えておかなければならなくなる。
1/2を0.5 1/4を0.25 と表示して欲しい場合って、printfのフォーマット指定でうまく書けるもの? もうひとつ 整数部も含め30桁って、printfのフォーマット指定でうまく書けるもの?
>>379 0〜9までは続いていることは保障されているよ
398 :
デフォルトの名無しさん :2011/07/28(木) 17:44:15.46
>>390 あの規定は拡大解釈するとおかしいことになる
「実行文字集合」とあるところは「翻訳環境が想定する実行文字集合」と読むべきで
開発してよいものの範囲を言語が主張するような解釈では筋が通らない
#include <stdio.h> void main( int argv, char* argc[] ){ int x = 10000; /* 任意の値 */ int y = 49; /* 任意の値 */ int cnt; printf("test: %d\n", x % y); /* 余りを10倍して割るを繰り返す */ for( cnt = 0 ; cnt < 30 && (x %= y) != 0 ; cnt++ ){ x *= 10; printf("%d", x/y); } printf("%d", x/y); } 出力するだけでいいならこんな感じか 入力処理は頑張れ
貼るソース間違えますた #include <stdio.h> void main( int argv, char* argc[] ){ int x = 10000; /* 任意の値 */ int y = 49; /* 任意の値 */ int cnt; printf("%d.", x / y); /* 余りを10倍して割るを繰り返す */ for( cnt = 0 ; cnt < 30 && (x = x % y) != 0 ; cnt++ ){ x = x * 10; printf("%d", x/y); } printf("%d", x/y); }
>400 循環小数かどうかはどこに表現されてるの?
402 :
デフォルトの名無しさん :2011/07/28(木) 18:08:28.44
>>396 >1/2を0.5
>1/4を0.25
%g
>>395 ,403
間違えた。 同じ余りが再度でてきたら循環。
>>404 ん?だから最大30個(29個か?)のあまりを覚えとかなきゃいけないんでしょ?
#include <stdio.h> #define INDIV_MAX (5) /* 終了する循環回数 */ #define LOOP_COUNT (30) /* 表示する桁数 */ void main( void ){ int x; int y; int cnt; int prev_x; int indiv_cnt; printf("xの値を入力してください ->"); scanf("%d", &x); printf("yの値を入力してください ->"); scanf("%d", &y); printf("= %d", x / y); if( x % y ) printf("."); /* 余りを10倍して割るを繰り返す */ for( cnt = 0, indiv_cnt = 1 ; cnt < LOOP_COUNT && (x = x % y) != 0 && indiv_cnt < INDIV_MAX ; cnt++ ){ x = x * 10; if( prev_x == x ){ indiv_cnt++; } else { prev_x = x; indiv_cnt = 1; } printf("%d", x/y); } }
循環を勘違いしてますた 出直してきます
>>405 例えば、1/77
=> 0.012987012987012988.....
最初の0.0の時点での余り10を覚えておいて、次回以降の余りが10になったら循環。
同じ余りがもう一回でてきたら循環という事でよろしいんでしょうか?
>>409 ん?だから最大30個(29個か?)のあまりを覚えとかなきゃいけないんでしょ?
30回くらい割り算するんだから
一度でも余りがかぶれば循環するから最初の一個覚えとけばいいってことで無いの? 数学は苦手なのでわかりません。
0.123434343434... 0.12以下34が続くような部分循環(?) ってありえるの?
っていうかyは0でもいいのか
>414 1222 / 9900
循環探すのって大変だな。
有理数は循環小数になるか有限桁で終わるかしかない そして有限桁で終わるのは決まったパターンがある
その点トッポってすげぇよな〜 最後までチョコたっぷりだもん
>>419 既約分数の形にしたときに分母が2または5の素因数しか持たないとき有限小数
1/9=0.1111111... 1/99=0.01010101010101010101010101010101... 1/999=0.001001001001001001001001001001001... 0.345345345... = 345/999 こんなんでヒントになる?
なんのヒントだよ 誰がヒントを求めてるんだよ
おれ
Warning: Unable to perform incremental link - performing full link... Fatal: Access violation. Link terminated. これどういう意味?
日本語でおk
428 :
デフォルトの名無しさん :2011/07/28(木) 22:38:25.76
gccでアライメントを考慮しない構造体って定義できますか? 例えば struct{ char a; int b; }; で5バイトになるようにしたいのです。
__attribute__((packed))
>>428 struct {
char a;
char b_[sizeof(int)];
int & b() { return reinterpret_cast<int&>(b_); }
int const & b() const { return reinterpret_cast<int&>(b_); }
}
>>430 これ、なにをしてるんですか?理解できません。
doubleとかの浮動小数点を扱うときに出る誤差って どんなときに注意するものなんでしょうか? 1桁の整数の四則演算程度ではまったく気にしなくていいのでしょうか?
>>434 目的に依る
お金の勘定とか、誤差のレベルで利害が大きく出る場合は注意が必要
1桁の整数の四則演算をdoubleでやると誤差が出ることがあるということでしょうか? 整数の四則演算なので、誤差があってはいけないレベルだと思ってます 具体的には、4つの1桁の整数を元に四則演算で10にするってやつです
>>438 実装依存です
たいていの場合には整数のみを扱う限り15桁までは誤差がまったくでません
1/3*3が正しく1になる理由が自分には理解できていないことがわかりました とりあえず誤差は出なさそうなので気にしないことにします ありがとうございます
>>440 その演算順序だと整数のみを扱ってないよ
1桁の整数の四則演算と言っていたのはこういうののことです 実際にいくつか試しても誤差が出なかったので問題が発生するまで保留にしときます 問題が出てくれたほうがちゃんと理解できそうだし
なぜ宿題スレと並行でやってんの?
>>442 #include<stdio.h>
int main(void)
{
double x, y;
int i, j;
for(i=1;i<20;i++)
{
x=1.0;
y=x/i;
j=y*i;
printf("%d\n", j);
}
return 0;
}
ビットマップリソースをexeファイルに埋め込もうとしてるのですが 13件前後(?)以上埋め込もうとするとaccess violationが出ます 件数や使用量による制約でもあるのでしょうか? またその場合はdllなどに分割して埋め込むような形で対応するのでしょうか? ちなみに使ってるコンパイラはbccです
誤差の話なんだが
http://ideone.com/SiEB0 これだと結果EQになってるが
自分の環境(gcc version 4.3.4 20090804 (release) 1 (GCC))だと
NEになる
誤差わけわからんな
>>446 自分gcc使い始めて1日目なので勘違いしてるかもだけど、
EQ : -mfpmath=sse
NE : -mfpmath=387
だったよ。(gcc 4.6.2/mingw)
ポインタのポインタやポインタのポインタのポインタの使い道を教えてください
>>445 bccは制限がある。
それ以来bccを使うのを辞めた
>>451 それガチ?
とりあえずgccとやらを入れてくるわ
学生のうちにC言語は、 このレベルまで学習した方が良い っていうのあります?
全部かな
なんだかなぁ・・・
>>453 そうやってヘンに目標を区切る必要あるかな?
やったらやったぶんだけ君のアドバンテージになるんだし。
卒業してからのことを考えてるんだったらなおさら。
>>453 やりたいと思う事ができるようになるまで
わからないことを検索して解決できるレベルまで。
bccでプログラムかいてコンパイルして gccでリソース埋め込みだけするとか可能?
そこまでしてbccにこだわりたいの?
思ったより移行が大変そうだから 段階的にいこうかなと・・・
なにが大変なの?Cygwin使えば?
ソースの書き換えが大変
VCでいいじゃん
BCCに依存するようなコード書いてるのか てかどんなコードがそれにあたるのか知らんな BCC→GCCで書き換えなきゃいかんソースってどんなの?
うるさいな・・・
__int64とか?
移植性とか考えないで作られると同じコンパイラでもバージョンアップも できないとかよく見るしな。 90年代にVC6で作ったシステムが、それ以降のVCに移行できないとか。
469 :
デフォルトの名無しさん :2011/07/29(金) 19:32:21.41
なるほど gcc のビルドを自分でやったこともないわけか
gccとかのCコンパイラってCでかいてあるんでしょ? 今世界中からC言語コンパイラがきえたらどうなるのっと
コンパイル自体は互換性あるんだろうけど ヘッダーやらdll、lib辺りは互換性も糞もなくね?
bccは無料コンパイラではあるが Win32 の深いトコロをやりはじめると 構造化例外処理(_try 〜 _finaly)が辛い キーワードだけ見るとC++っぽいけどVCのCのコンパイラ拡張で提供されてる部分
大学時代、友人が学校のPCのHDDからTurboCコピーしていった。 FDしかなかったのになぁ。
やはり Turbo C 2.01 がオススメだよな。 統合開発環境も付いてるから初心者でもすぐ始められるし。
だな。 コンパイルは早いし、ライブラリも充実してるから高度なソフト開発に最適だし。
TurboCって、まだ売ってんの??
>>478 まだborlandがdelphi手放さなかった頃はborland C++ suiteと言う製品として買えてた
(中身はDOS時代のアセンブラ/コンパイラの詰合せ)
配列の「添え字」と「要素番号」の違いってなんですか?
なんじゃそりゃw
質問です int 同士の割り算で常にマイナス方向に丸めたいのですが よい方法があれば教えてください -21/10 を -3 にしたいです 画像処理に使うので高速な方法でお願いします
>>482 a / b
↓
(a-b+1) / b
にすればいいのかな。
a = -21 → (-21-10+1) / 10 = -3
a = -20 → (-20-10+1) / 10 = -2
>>483 そうです
今は a が0以上のときと負のときとで場合分けしていますが
ループの一番深い部分なので高速化したいです
>>482 限定的な方法
適用できる条件がかなり厳しいけど
全体を正方向にシフトして計算した後で元の場所にシフトして戻す
a / b
で b が変化しにくい時
シフトする数を c=1000 とか安全な数として d=c*b を予め計算する
(a+d)/b-c
欲しい結果はコレ
加算一回、減算一回増えるだけで済む
487 :
482 :2011/07/30(土) 20:11:00.77
>>486 b はループの浅い部分で決まるので使えそうです
安全な数をどうやって求めるか考えてみます
ありがとうございました
>>483 >>485 さんもありがとうございました
『今日もいい天気です 明日もよい天気でしょう。』 とコンパイラしたいのですが『今日もいい天気です。¥n明日もいい天気でしょう。¥n』とでてしまします。これは何が原因なのでしょうか。コードも貼っておきます。 /*練習*/ #include<stdio.h> int main() { printf("今日もいい天気です。¥n"); printf("明日もいい天気でしょう。¥n"); return 0; } ちなみにMacのターミナルを使ってC言語の勉強をしています。親切な方、ご教授ください。
¥じゃだめだ\にしろ
macの罠
Mac 関係無い
macは宗教
macを手に入れて、最初にしたのは ターミナルを使えるようにすること
>>496 それは、家電量販店でmac見かけたら最初にやる事
最初にやることはマルチタッチジェスチャーじゃろ
>>488 「よい天気」とだしたいのに「いい天気」と書いてれば「いい天気」と出るのは当たり前だろ
GUIはいらない
× \ ○ ??/
> コンパイラしたい
任意のbit範囲を反転させる関数はどのようにすればいいでしょうか? int rev_bit(unsigned n, int lower, int upper) { } int main(void) { unsigned n = 0x32; /* 00110010 */ n = rev_bit(n, 1, 5); /* 1〜5bitの範囲を反転 */ printf("0x%x", n); /* 0x29 00101001 */ return 0; }
return n ^ ((1 << upper) - (1 << (lower - 1)));
あ、反転って左右反転か。忘れて。
一般的な言葉とは言え、別のことをあらわす用語そのまま 使ったら混乱するわw
507 :
デフォルトの名無しさん :2011/07/31(日) 17:32:31.39
あとビット番号は 0 から開始が通常な 上位ビットを左で書かないと怒られる案件もある 紛らわしい言葉遣いはコード・日本語ともによくある 引っかからないことも適性の1つだ
>>503 int rev_bit(int n,int l,int u) {
for (--l,--u;l<u; ++l,--u)if(((n&(1<<l))>>l)^((n&(1<<u))>>u))n^=(1<<l)|(1<<u);
return n;
}
8bitの範囲ならテーブル作るのもひとつの手だな。
VC++2008とVC++2010ってどこが違うの?大幅に変更されてたりする?2008がインストール出来なかったから代用したいんだけど。
2008:軽い 2010:重い
515 :
デフォルトの名無しさん :2011/07/31(日) 20:00:22.22
printf 系の関数を使わずに、float や double を (効率よく)文字列化する方法を教えてください。 なお、OS や処理系に依存するのは NG です。
宿題か?
質問者が回答者に対して NG 宣言するのは斬新だなw
「環境非依存である事」という条件は 斬新なのでしょうか?
指数部読んで割る10掛ける10を有効桁数繰り返す。
>>519 NG は No Good という事
クイズの出題者や試験の採点者が使うなら分かるけど、
教えて貰う相手にお前の答えは Good じゃないとは
言わないでしょ
>>521 >教えて貰う相手にお前の答えは Good じゃない
誰もそんなこと言ってなくね?
そう思うならそれで良いよ
>>520 懇切丁寧なご説明、感謝します。
おそらくは「自分で実装するしかない」という事を
言いたかったのだと解釈したのですが、正しいでしょうか?
>>521 情緒溢れる解説、誠に有り難う御座います。
世の中には色んな人がいることを
改めて学ばせていただきました。
浮動小数点をどう表示するかで答が変わるんじゃあ?
float、double の内部形式がそもそも環境依存じゃなかったっけ
2回のサイコロ試行でゴールに到着 1 2 3 4 5 6 7 8 9 * >Dice try (N=end) number = 2 1 2 3 4 5 6 7 8 9 # *(3) >Dice try (N=end) number = 6 1 2 3 4 5 6 7 8 9 #(3) *(9) となるようにプログラミングしたいのですが、 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int num; srand( (unsigned int)time( 0 ) ); printf( "1 2 3 4 5 6 7 8 9\n" ); { int i,sai; static int a; sai=rand()%6+1; a=0; a=a+sai; for( i = 0 ; i < 8 ; i++ ); return 0; } ここからどうすればいいですか?(見にくくなってすみません)
>>526 >結局は既存のコードを研究するのが一番の近道なんじゃないかな
やはりそうですか・・・
もしや「私の知らない裏技がないか?」と思って、
今回尋ねてみたのですが。
了解しました。
>>528 ごめん
そもそもルールが分からんのだが。。。
>>531 なるほど。
こんな事に対しても「高速化」の研究がされていたのですか。
勉強になりました。
>>530 さいころを一回ずつ振って出た数字だけ進み9でとまれば終わり
オーバーしたら余りの目の分だけ戻る
てルールです。
>>533 2回以上振っても、9で止まらない限り終わらない。でおk?
>>535 おk
取り合えずもう一個"*"表示用の配列用意しようか
いじる所多そうだから、こっちでも一回作ってみる
537 :
デフォルトの名無しさん :2011/07/31(日) 23:12:31.50
#include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { int num,i,sai; char ps[] = " \n"; char c; srand((unsigned int)time(0)); num = i = sai = 0;
538 :
デフォルトの名無しさん :2011/07/31(日) 23:12:59.43
while(i != 8) { sai = rand()%6+1; num = i; i += sai; printf("サイコロの目%d\n",sai); printf("123456789\n"); if(i > 8) { i = 8-(i-8); } ps[i] = '*'; printf("%s\n",ps); ps[i] = ' '; printf("続けますか? Yes = Y/y No = Enterj\n"); c = getchar(); if(c == 'Y' || c == 'y') return 1; } printf("クリアしました。\n"); return 0; }
539 :
デフォルトの名無しさん :2011/07/31(日) 23:18:06.37
return 0; } 作ってみたお。 以上、3分割です。 ベースとなるソースとは全然違う形になったけど、良いよね? (クリアするまで一気に終わっちゃうから、続けるか確認する処理も勝手に追加したしw) 最初から自分で書いたらもうちょいましな形になったんじゃろか・・・
541 :
デフォルトの名無しさん :2011/07/31(日) 23:21:24.97
おおう・・・ ps[] ="\n"は、"\n"を" \n"(空白8個分)に置き換えて下さい。
542 :
デフォルトの名無しさん :2011/07/31(日) 23:23:11.96
追記 psはポジションの略としてpsという変数名にしました。 (ただのaじゃ味気ないので勝手に変更しました)
543 :
デフォルトの名無しさん :2011/07/31(日) 23:24:45.93
>>540 どういたしまして。
どういう動作してるか、調べてみて下さいね。
544 :
デフォルトの名無しさん :2011/07/31(日) 23:26:53.57
あう・・
>>541 に嘘かいてた・・・
空白は9個分です。
545 :
デフォルトの名無しさん :2011/07/31(日) 23:35:15.32
バグ発見・・・ 続けますか?じゃなくて、終わりますか?だった・・・orz
メインで 構造体のポインタを宣言しているが fooにポインタのポインタで渡していないから (fooでポインタのポインタに領域を確保する)
548 :
546 :2011/08/01(月) 01:43:40.94
hoge自体が存在するアドレスにmallocをしないといけないから、 それをするためにはhogeのアドレス、すなわち&hogeを渡さないといけない、ということで良いんでしょうか それでは、現状だと一体何が受け渡されているのですか? hogeは最初ぬるぽですが、このまま関数に渡した場合、hogeの示すアドレスを渡すわけで、 そのアドレスに対してmallocという考え方だったのですが。 すみません、ポインタがよく理解出来ていないみたいです
550 :
546 :2011/08/01(月) 01:49:33.92
あ、mallocで得たアドレス値を格納する先をアドレスとして知らなくてはいけないのか だから&でその変数のアドレスを渡さないとそりゃ反映されないっすね。すみません、ありがとうございました
551 :
546 :2011/08/01(月) 01:50:34.43
>>549 修正ありがとうございます。
ようやく少し解った気がしました
>>548 >>549 main() の hoge には NULL というか、でたらめ値が入っていて、
それが foo() にそのままわたっています。foo() の hoge は NULL というかでたらめ値。
次に hoge には、malloc() の返り値が入ります。
そしてそのまま foo() は終了し、hoge の値は胡散霧消です。hoge は関数内ローカル変数ですから、そのままでは main() に渡りません。
main() に hoge の値を返したいのなら、そのように表立って記述しなければなりません。
>>549 foo()
あるいは、main() の hoge のアドレス &hoge を foo() に渡して、
p = &hoge
として *p = malloc() とすれば、main の hoge に malloc() の返り値を入れる、ということを foo() の中で行うことができます。
>>549 bar()
失礼。遅かったようですね
>>552 は捨て置いてください。
MacのターミナルでC言語を勉強しているものです。 0.500000+10.50000=11.00000 cの値は215でこれに11を加えると226となります eには"A"が代入されています と表示させたいのですが、エラーとなってしまいます。どこが間違ってるのか分かる方、教えてください。 #include<stdio.h> int main() { double a=0.5,b=10.5; int c=215,d; chare e='A'; printf("%f+%f=%f\n",a,b,a+b); d=c+11; printf("cの値は%dでこれに11を加えると%dとなります\n",c,d); printf("eには\"%c\"が代入されています\n",e); return 0; }
>>554 エラーが出たならエラーメッセージくらい貼りなさい。
chare e='A';
>>555 はい、すみませんでした。こちらになります...。
main.c: In function ‘main’:
main.c:8: error: ‘chare’ undeclared (first use in this function)
main.c:8: error: (Each undeclared identifier is reported only once
main.c:8: error: for each function it appears in.)
main.c:8: error: expected ‘;’ before ‘e’
main.c:15: error: ‘e’ undeclared (first use in this function)
>>556 シングルクォーテーションの使い方がおかしいということですか?
char だろ、どこで教わった?
注意力が足りないだけだろ。>555に答えがあるのに気付いてないし。
>>558 あああああああああ!!!!ありがとうございます!!!!プログラムが間違ってると思ってたのですが、そうではなくて単なる打ち間違いだったんですね...。すみません、助かりました。
>>559 ほんとにその通りです...。このようなことで書き込みをしないで済むようにもっと集中したいと思います...。
562 :
デフォルトの名無しさん :2011/08/01(月) 14:39:13.30
>>557 main.c: main 関数の中で:
main.c: 8: エラー: chare が未定義(この関数で始めて使った)
main.c: 8: エラー: (未定義の識別子は関数ごとに一度だけ報告します)
main.c: 8: エラー: e の前に ; がない
main.c: 15: エラー: e が宣言されていない(この関数で始めて使った)
微笑ましい遣り取りと言わざるを得ない。
564 :
デフォルトの名無しさん :2011/08/01(月) 19:49:39.73
C言語でwebプログラミングなんて、できるのかな?
>>564 サーバー側の話なら、cgiは作れるけど。
クライアント側の話なら、もうちょっと簡単かも
まったくの無知が興味本位で聞きたいんだけど webプログラミングっていうのは要するに ソケットプログラムで80番ポートを利用するサーバーを作って ハイパーテキストを返せばいいの?
>>566 それはどちらかというとウェブサーバプログラミングじゃないの
socket とか listen とか accept とかは下回りのライブラリに任せて、
レスポンスヘッダ以降がウェブプログラミングの範疇だと思うわ
サーバーサイドの話なのかクライアントサイドの話なのか その両方なのか さっぱり見当がつかない ぱっと思い浮かんだのが php で鯖内DBとやりとりするようなのだが # これはサーバーサイドで ある程度環境整えてる上で駆動されるスクリプト のプログラミング
クライアントサイドだとウェブアプリプログラミング
質問者はwebプログラミングがなんなのか理解して無いんだろうな。
apatchやAN HTTPDのようなソフトのことを言っているのか、cgiを処理するようなソフトのことを言っているのか。
572 :
デフォルトの名無しさん :2011/08/01(月) 21:50:13.77
質問です ポインタをインクリメントしたら、次に差すアドレスって 何個跳びになるんでしょうか? 0x0002←この値をインクリメントする お願いします
>>572 sizeof(型)で調べられます。charの場合のみ1と決まっています。
574 :
デフォルトの名無しさん :2011/08/01(月) 21:58:43.39
>>573 あ、そういうことですか
宣言したときのサイズで、そこからそのサイズ分飛ぶことにねるんですね
ありがとうございます
>>574 ちなみにsizeof(変数) でもOKです。sizeof(リテラル)でもOKです。
sizeof(生け贄)
char c = 'a'; sizeof(c) = sizeof(char) ≠ sizeof('a');
sizeof(^^;)
sizeof('a') = sizeof(int) sizeof(' ^^ ') = sizeof(int)
? ポインタ(アドレス)のサイズじゃぁ?
if( !sizeof(おっぱい) ) printf("人に非ず");
sizeof(int) ≦ sizeof(int*) 流石にintの方が大きいことは無いよな?
ポインタ変数って基本的に 4バイト固定?
すいません64bitのwindowsで作成したアプリは32bitのwindowsでは動かないんでしょうか
16bit DOS用だと…。
はずかしながらosの○○bitがレジスタ長だと今知りました。
intelだとintってレジスターのサイズじゃねえの? だからポインターもunsigned intで代用できると思ってたわ。
8bitCPUでも16bitレジスタが使えた
>>588 DOSの時代は、ポインタが16bitと32bitと混在してたな。
DOSだと386/486でも16bit。 Win32だと64bitCPUでも32bit。 当たり前か。
DOSの時代はMS-CもTurboCもポインタを16bit, 32bit混在させられた。
つ LP64 つ LLP64
ちなみに仮想マシンとかだと 8bit align 前提で、その分ポインタ幅を切り詰めて 型情報を埋め込んだりします
ポインタに関連して質問です。 下記みたいな感じで#define にアドレスを宣言しておいて 関数の引数をポインタにしておけば、関数に対してアドレスって渡せますか? void sub(int *aaa); #define ABC 0x00FF //渡したいアドレス main{ sub(ABC); } void sub(int *aaa){ }
sub((int*)ABC); キャストしときゃ大丈夫なんじゃね?
>>597 そこまで書いてるなら、自分で動かして見たら良えやん
あと、{}の使い方はC言語の流儀に従っとけ
static void sub(int * aaa) { ...; } sub((int *) 0xff);
>>598 >>599 >>600 ありがとうございます。
家には環境がないので、明日試してみます。(環境作ってないだけですが…)
キャスト勉強になりました!
{}の使い方って
>>600 さんみたいな感じが一般的なんですね。
普通にコンパイル通ってたので気にしたことなかったです。
スタイルはプロジェクト内で統一&ツールで整形・チェックでいいじゃん。 品質とかアルゴリズムの理解とか、もっと重要な事があるだろ。
>>601 スタイルは言語ごとや個人でも違うけど、その言語の入門書に書かれてるスタイルに合わせるのが無難
606 :
デフォルトの名無しさん :2011/08/02(火) 13:02:25.82
スタイルならここでしょ
http://www.ioccc.org どこぞの胡散臭いとこみたいな洗脳じゃなく
しっかり議論(論争ではない)された合理性こそ大事
自分と違うスタイルなんてそこいら中にあるのに使われた瞬間アウトとか論外だよ
intの時はかっこ必要でない?
sizeof(char)の括弧は必要
char c = 'a'; sizeof(c) = sizeof((char)) ≠ sizeof('a'); sizeof('a') = sizeof((int)) sizeof(' ^^ ') = sizeof((int))
パイプを使ってプログラムAの標準出力をプログラムBの標準入力に繋ぐことはできますが、 これをさらにプログラムBの標準出力をプログラムAの標準入力に繋ぐにはどうしたらいいですか?
A|B|A
書き方が悪かったの。 プロセスA、プロセスBと読み替えて下さい。
どっから実行したの? pipe() 使うのはどう?
標準入出力が何かわかってるのかな?
どっちのプログラムの方が処理早いんだろうって悩んだ場合 普通はコンパイラにアセンブリ言語で吐かせて見比べるの? それとも時間計ったりするの?
職人の勘かな
測る 測定結果に疑問があったらアセンブリを見てみたり色々する
速度は実測が基本
処理時間を測定したい場合 普通にtime.hの関数使って測定したらいいの? 実時間を計ればいいだよね? プロセッサ時間?
あなたが気のすむ測り方でやるしかない
622 :
デフォルトの名無しさん :2011/08/02(火) 22:04:41.47
実測に愕然とした後、そこで終わるやつと、そうでないやつがいるんだよ このスレでタコツボやってる間、前者の域を出ることは決してない
gprofを使えば、プログラム中での各関数の合計実行回数と、合計実行時間の一覧表を得られる。 この表を見れば、最も沢山実行されて、かつ、最も処理に時間が掛かってる関数がわかる。 合計で0.0010秒しか実行されない関数を、2倍の速度にしても 0.0005秒しか速くならないけど、 合計で1秒実行される関数を、2倍の速度にすれば、0.5秒も速くなる。 アセンブラのmovdqa命令の実行時間を知りたいなどのシビアな要求の場合は、gprofでは厳しいが、 gprofは、ボトルネックの大体の見当を付けるのには便利。
ある変数の値によって処理が多数分岐する場合 switchやif使うより関数ポインタ配列使って分岐したほうが 早いんだろうか? 誤差レベル?
>>625 だから、処理時間は実測が原則。
それより、関数ポインタ配列を使うとコードが大きく変わることになるから
運用者のスキルが低いと「>625さんは難しいコードを書くから保守できなくて困る」なんてことになりかねないw
冗談兎も角、コンパイラの最適化で随分違うから、実測するしかないよ。
>>623 gprofだと、インライン展開される関数の所要時間が全く測定できないけどね。
なので、gprofで切り分けた後はclock()かgettimeofday()のような関数を使って
セクションごとの通過時刻を記録することも場合によっては有効。
つーか、この辺の話は入門編向きじゃなかったね。
627 :
デフォルトの名無しさん :2011/08/03(水) 11:00:19.50
ハノイの塔の問題でfor文の中に入るプログラムがわかりません。 どなたか教えてください。 ハノイの塔の移動回数を求めるプログラムです。 #include<stdio.h> int main(){ int h[9][99],n,nmax,t3,t4,w; printf("ハノイの塔問題 : 円盤の移動回数\n"); scanf("%d",&nmax); h[3][0] = 0; for(n=1;n<=nmax;n++){ h[3][n] = h[3][n-1]*2 + 1;} h[4][0] = 0; h[4][1] = 1; h[4][2] = h[3][2]; for(n=3;n<=nmax;n++){ } printf("円盤数 塔三本 塔四本\n"); for(n=1;n<=nmax;n++){ printf("%6d%12d%8d\n",n,h[3][n],h[4][n]); } }
ググレカス
質問スレでググれとは何事か 俺もわかんねーけど
#include<stdio.h> int main(){ int n,nmax,w; printf("ハノイの塔問題 : 円盤の移動回数\n"); scanf("%d",&nmax); w = 2; for(n=1;n<nmax;n++){ w*=2; } w-=1; printf("移動回数 %d\n",w); } 移動回数を求めるならこんな感じ?
何を聞いてるか理解できないアホは帰れよw
まあググればなんとかなるかもな。 for文の中は、ハノイの塔が4本の時の移動回数だな
>>627 ハノイの塔は再起で書く方が楽なプログラムの代表例ですよ
4本のときを再帰で書いてみてくれ
cygwinのgccでcygwin1.dllの不要なexeファイルを吐かすにはどうすればいい?
グッグレ〜カス
gcc4だとできなかった気がする
クロスコンパイラがうんたらーってできないんだけど
>$ gcc -mno-cygwin test.c >gcc: The -mno-cygwin flag has been removed; use a mingw-targeted cross-compiler. うんたらーってなんだよ。書かれてるまんまだろ。
cygwinのdevelop全部ぶちこんだけどできねーぞ
できるわけねーだろ。
そのフラグなくなったから; mingw (をインスコして)そっちでやれ
>>634 #include <stdio.h>
void hanoi(int,char,char,char);
void main(void)
{
int n;
printf("How many disks? ");
scanf("%d",&n);
hanoi(n,'a','b','c');
}
void hanoi(int n,char a,char b,char c)
{
if(n>0) {
hanoi(n-1,a,c,b);
printf("No. %d disk is moved from %c to %c.\n",n,a,b);
hanoi(n-1,c,b,a);
}
}
4本だって言ってんだろw
cygwin なんて使ってるからw つーか、cygwin が何なのかを理解せずに使ってるのは問題外だな。 素直に VC++ を使うとか、Vine 辺りを使っとけばいいのにな。
話を聞かない奴が多いなw
少しは残ってる脳をつかえw ここは池沼の集まりかよ・・
配列を見て、ハノイで再帰じゃないなんてバカじゃねwとか脊髄反射しちゃうんだろうな 必要だから配列に保存してんのにな
急に草が生え始めましたね^^;
日本語もまともに読めないアホに
>>644-646 みたいな書き込みされたら笑いたくもなるだろ
日本語も英語も読めないのにC言語を読もうとすな
>>655 それでちゃんとした解になるかどうか、実際に書いてみてからほざけよw
最近、答えそのものを教えてもらおうとするアホが多いよな。
mingw32-gcc.exeっての使ったら出来ちゃった///
「ハノイ 4本」でググれば、理解できるかどうかは別として、望みのものが見つかるだろ
4本全部使うのと、3本しか使わないのとじゃ、結果が全然違う バカが自分の間違いを認められないのって見苦しいよ
4本ハノイの塔 あってるかどうかは分からん #include<stdio.h> void hanoi(int disc, int from, int to, int empty1, int empty2) { if(disc<=1) { if(disc==1) printf("disc%d : from %d to %d\n", disc, from, to); return; } hanoi(disc-2, from, empty1, to, empty2); printf("disc%d : from %d to %d\n", disc-1, from, empty2); printf("disc%d : from %d to %d\n", disc, from, to); printf("disc%d : from %d to %d\n", disc-1, empty2, to); hanoi(disc-2, empty1, to, from, empty2); } int main(void) { int disc=10; hanoi(disc, 1, 2, 3, 4); return 0; }
よくわからんが 解くだけなら3本でも可能だが 多くの本数を使ったほうが 少ない手で解けるって事?
>>645 さんごめんなさい
間違って日本語読めないアホ扱いしてしまいました
本当に申し訳ない
indexによって処理が分岐する場合の関数呼び出しを、
*f[index] で書いた場合、switch(index)で書いた場合、if(index== で書いた場合での、各所要クロック数を、rdtscで記録
http://codepad.org/1tJvMTad <-O0でコンパイルした場合>
関数ポインターの配列の場合
所要クロック合計 = [5510152791]clock, 1ループあたり[55.101528]clock
switchによる関数呼び出しの場合
所要クロック合計 = [5903273688]clock, 1ループあたり[59.032737]clock
ifによる関数呼び出しの場合
所要クロック合計 = [5885933079]clock, 1ループあたり[58.859331]clock
<-O2でコンパイルした場合>
関数ポインターの配列の場合
所要クロック合計 = [3625614759]clock, 1ループあたり[36.256148]clock
switchによる関数呼び出しの場合
所要クロック合計 = [2829590153]clock, 1ループあたり[28.295902]clock
ifによる関数呼び出しの場合
所要クロック合計 = [2943078411]clock, 1ループあたり[29.430784]clock
最適化しない場合は関数ポインターが最速で、最適化した場合はswitchが最速になった。
switchとifによる関数呼び出しの場合、最適化時にインライン化できることが速度向上に関係してる気がする。
671 :
デフォルトの名無しさん :2011/08/03(水) 19:14:02.69
>>670 おまえさんがその質問をしている胸中で
「自分ならこうすればいいと思う」
「一般ユーザがやるのは大変」
と思っているなら、そこに本質的な問題点と正解がある
Cは標準では連想配列は提供されていません。
質問するでもない 答えるでもない奴ってなんでここにいんの?
非標準なら提供されてるのか? あると便利だよな。知りたいw
>>675 するどい指摘をした!俺って頭イイ〜! とか思ってんの?(゚σ ゚)ホジホジ
>>677 知らないから聞いたんだよ。あるなら便利だろw
いちばん早く習得した言語って何ですか?
日本語
ツマンネ
#include <stdio.h> int gcd(int x, int y) { if (y == 0) return x; else return gcd(y, x % y); } int main(void) { int a, b, c; for (a = 1; a < 300; a++) { for (b = 1; b < 300; b++) { for (c = 1; c < 300; c++) { if (a * a == b * b + c * c ) { if (a + b + c < 300) { if (gcd(a, b) == gcd(a, c) == gcd(b, c) == 1) { if(b > c){ printf("a = %d, b = %d, c = %d\n", a, b, c); } } } } } } } } これで一応動きはするのですが、関数等の記述はこれでいいのでしょうか
>>682 >if (gcd(a, b) == gcd(a, c) == gcd(b, c) == 1) {
これの意味が分かってやってるなら別にいいよ
>>675 対偶を知らないバカでもこの業界にいられるんだな。w
対偶しらないとやってけない業界なんて聞いたことないw
いやわかってるだろ。 間違えてるけど。
使いたかったんじゃないの?
対偶を知らないバカでもこの業界にいられるんだな。w
プログラム技術板業界?
業界(笑)
知らないんじゃない。小学生でも知ってる常識を居丈高に使っている君に嘲笑の眼差しを送っているだけさ。
厨房だけどプログラミングやるならどんな数学勉強したらいいかな? いまはフーリエ解析とかゼータ関数とか勉強してる
作りたいアプリケーションの種類によるとしか言いようがないな
>>694 何を作りたいのか、どんなプログラムに興味があるのかを考える。
数学のどの分野がそれに関係しているのかを調べ、勉強する。
必要になってからさらっと覚えればいいだけだから、 そういうやり方は全くの無駄。
これは覚えとけっていうのはないんですか?
STLのリストに親クラスを継承した子クラスのオブジェクトを突っ込んで イテレーターでぐるぐる回しながら子クラスのオーバーライドした関数を実行して個別処理をさえsる ような仕組みをC言語で実現するにはどうしたらいいですか
英語は問題ないので数学でお願いします
702 :
デフォルトの名無しさん :2011/08/04(木) 15:01:05.29
>>700 関数ポインタと offsetof
人によっては union と enum を好んで使う
vtable の仕組みさえ知っていればどうにでもできる
>>701 プログラミング自体に数学は必要ない
数学をプログラミングで解きたいなら数学の知識が要るだけ
三角関数と行列くらいは最低でも知っといて欲しい
その程度でいいなら大丈夫そうです
>>700 関数ポインタと汎用ポインタのペアの配列を使う
cygwin上でリンクする時に gcc -mwindows -o test.exe test.obj resource.coff とするとdllが必要な代わりに正常にうごく mingw32-gcc -mwindows -mno-cygwin -o test.exe test.obj resource.coff とするとdllが不要だがリソースとして埋め込んだビットマップ画像が 一部表示されなくなるのは何故?
>>708 cygwinスレへどうぞ。そもそも、今のcygwinのgccに-mno-cygwinは使えないので要注意。
>>700 ,702,707
ここはC入門スレ。
ソースplz
スレチなお馬鹿さん大杉だろ
gcc -mwindows -o test.exe test.obj resource.coff これなら全てのビットマップリソースが正しく表示されるのに mingw32-gcc -mwindows -o test.exe test.obj resource.coff これだと一部のビットマップリソースが正しく表示されない
714 :
デフォルトの名無しさん :2011/08/04(木) 23:54:12.78
>>709 では、あなたこそ「にゅーもんスレ」へどうぞw
sprintf関数について質問なんですが、この関数ってただ文字列を連結するだけですよね? strcat関数は2個の配列しか結合できないんですよね? ならstrcat関数使わずsprintf関数だけ使うようにしてもいいですか?
unionってどういう時に使うの?
メモリを節約したいとき
何らかの処理のために変数にバイトごとにアクセスしたいときとか union { long a; char b[4]; }
同じようなキャストを繰り返してるコードに気付いたとき
720 :
デフォルトの名無しさん :2011/08/05(金) 01:49:30.32
ただ「同時には使わない」という本来は疎遠な関係が あまりにも緊密に描かれすぎるのが難点
自分ではうまいこと言ったつもりなんだろうな... さっぱり言いたいことが伝わらないけど。
>>716 一例だけど、通信パケットみたいに、どこかのフィールドによって
同じ領域の解釈の仕方を変えたい時に、その事を明示したい場合にも
使えるね。
>716 バージョンのよりデータの構造が変わる場合等。 struct xxx { int ver; union { struct ver1 { .... }; struct ver2 { ... }; }; ... verの内容を見てver1かver2、どちらを参照するか判断する。
RGBAの4バイトのデータを取り出したいときと RGBAの中のRの1バイトだけを取り出したいときとか よくあるだろ?
725 :
デフォルトの名無しさん :2011/08/05(金) 11:42:43.01
ついていく気ないので、チラ裏にでも書いてろよ。
お前がそうしろ
自分が分からないことは全部チラ裏に書けとかどんだけ
ヒントになるかどうかわからんが WM_PAINTメッセージ内の BitBlt(hdc,0,0,240,480,hBackDC,0,0,SRCCOPY); の前に BitBlt(hBackDC,x,y,40,40,hBmpDC,0,0,SRCCOPY); を入れてみて
>>730 返信ありがとうございます。
書き忘れていましたがその方法はすでに試していまいた。
本当にすみません。
>>BitBlt(hBackDC,x,y,40,40,hBmpDC,0,0,SRCCOPY);
↑の方法では前回描画した絵が消えず
上に描画する画像がつながった様に表示されます。
なんとか画像のリフレッシュをすることができないでしょうか・・・
for( int i=0; i<n; i++ ) という書き方について、自分としては使い捨てのインスタント変数を作ってその場で捨てれるので便利だと思うんですが 学校の先生は「メモリ確保→開放の分だけ処理が重くなるからなるべく使わないように」と説明していました でも参考書などではwhile文の中身で変数を用意していることも多く、中にはこういう書き方を推奨してるようにも見えて少しこの説明に疑問を感じます 処理はどの程度重くなるのでしょうか、処理を軽くしたい時には変数のメモリ確保を減らすのはどの程度有効なのでしょうか
ウィンドウに転送する用のデバイスコンテキストをもう一つ作って 毎回そこに全ての画像(背景から全て)を描画すればいいよ
>>732 重くなることは、真っ当なコンパイラなら全く有り得ない。
先ず第一に、ローカル変数は確保や解放に殆どコストが掛からない。
第二に、ソース上ではスコープを絞っても実コードがその通りのタイミングで確保されるわけではない。
だから安心して、変数スコープを絞って使え。
普通コンパイル段階でこの関数はローカル変数にどれだけメモリ使うかって計算するものだよな?
この先生、 関数呼び出しはコストが掛かるから、 全部mainで処理しなさいって言いそう
あくまでCに限って言えば宣言は関数の先頭に記述するべきと 先生は言いたかったんではないだろうか?
じゃあ全部ハードウェアで処理しろよカス
>>732 int main() {for(int i = 0; i <10; i++){}} を gcc -S などでアセンブラに変換して先生に
見せてあげるといいんじゃないかな
>>735 自分の場合は、そもそも大きいデータをスタックに割り付ける様なコードは書かないなあ
再帰する関数の場合は流石に気にしますけど、計算はしません
Windows って使用するスタックサイズをプログラム実行時に変えられないんだっけ?
>>737 理由がメモリ確保がどうとかだから、C++でもJavaでもfor(int i;…みたいな
書き方は禁止なんじゃないの。
この先生。
まぁでも先生云々は置いといて実際プログラム書いてて for( int i = 0 ; i < 10 ; i++ ); この形が推奨されるべき形ってそう無いぞ
コードを書く時に他人の推奨とか気にしないわ
そこ開き直ったら本末転倒だろw
スコープを限定するのは推奨されるべき
学校の先生は論理を超えた強制力を持ちうるから、何らかの対策が必要だなと思う 先生云々置いとくなら、自分の意図した通りに動くコードならそれで充分
ありがとうございます 安心してfor内に記述する事にします。 正直forとかで回す変数をいちいち最初に宣言してると段々「一回しか使われてない変数」とかが出現するのが嫌だったんですよね けど一つの変数を色んな用途に使ってるとバグ出しそうで危なっかしいし
>>744 俺もそう思うけど、
「長いブロックを書くから、ループ変数ごときでスコープを限定しないといけなくなるんだ」
とか言いだす人が居そう
for文出てくるたびに領域確保してたらメモリの無駄じゃん ループカウンタくらいまとめていいだろ
>>741 C99とかC++とか、その書き方ができるなら普通、そう書くでしょ。
>>748 for文出てくるたびにスタックフレーム伸ばしたり縮めたりする実装なんてないだろ。
>>750 固定長だから無駄に宣言して良いと思ってんの?
>>751 いいんじゃないの?
数バイトとかパフォーマンスを気にするより、コンパイラに最適化を
まかせてコードの質を優先すべきところ。
>>751 スコープを制限するために変数宣言することを
無駄と考えるならお前はプログラマに向いてない
for( char c = 0; c < 10; c++) とかしてる人はいるのかな? 4バイトォォくらいの割り付けをケチるより、分かりやすいコードを書いた方が良いと思う
そんなことより SHORT_MAX を超えるループカウンタに int 使ってるのを論じようぜ
スクリプト言語系なら毎回確保もありうるような気がするけど…。
大きなプログラムを書くことを禁止したらいいよ
>>755 gnuとか、20年くらいまえからintは32bit以上前提でコードを書いてるって
聞いてうらやましかった思い出がある。
>>756 LL系こそ「メモリがもったいないから変数を使いまわそう」みたいな文化じゃないような気が。
富豪的っていうの?
最近のスクリプト言語って実行前に一度ソース全部読むの? ActivePerlでは読んでるっぽいけど。
Rubyは下で定義したメソッド(関数)を上で呼べない
762 :
デフォルトの名無しさん :2011/08/06(土) 16:39:33.91
>>761 ん?
# cat foo.rb
#!/usr/bin/ruby
def foo
bar()
end
def bar
puts "bar"
end
foo
# ./foo.rb
bar
>>761 今時、そんな言語はcとpascalくらいだよ。。。
(cはプロトタイプ宣言で回避)
こういうことだろ foo def foo puts "foo" end
766 :
デフォルトの名無しさん :2011/08/06(土) 19:19:02.57
>>764 その意味で C89 は K&R C より退化した
gccはmallocで取得した領域は勝手に0で初期化するのに mingw32-gccだと初期化してくれないんだな・・・ ヘッダーファイルが上手く動作してなくて4日くらい悩んだわ・・・
勝手なことするってほんとよくないな
769 :
デフォルトの名無しさん :2011/08/06(土) 19:46:56.68
つーか、malloc にゼロ初期化を期待するほうがよくないだろ
ほんとそのとおり。
>>765 評価されていないメソッドが呼び出せないのは当たり前じゃないの?
% cat foo.py
#!/usr/bin/python
foo()
def foo():
print("foo")
% ./foo.py
Traceback (most recent call last):
File "./foo.py", line 3, in <module>
foo()
NameError: name 'foo' is not defined
これはソースコードを読むかどうかとは全く別の話だよ
あ、スマン コピペする時に行を詰めたのでエラー位置は気にしないで
>>771 当たり前だと思うよ
ただ、ああいうことが言いたいんだろうなって
>>771 Python はちょっと特殊だよ。
def とか class も実行文だから。
>>773 了解した
>>774 % cat ../foo.lsp
(foo)
(defun foo () (print "foo"))
% ./dx86cl -l ../foo.lsp
> Error: Undefined function FOO called with arguments () .
一方 JavaScript さんは...
% cat foo.js
foo();
function foo() { print("foo"); };
% jsc -f foo.js
foo
JS はこれが正解だったか... foo(); var foo = function() { print("foo"); }; スレ汚しスマソ
>>733 どういう意味か分からずずっと考えていましたがやっと解決しました。
ありがとうございます。
デバイスコンテキストに描画するとかって言うやつもいるけど APIだと実際描画してるのはWM_PAINTのBIGINPAINT〜ENDPAINT内だけ DCにはデータを用意するだけで描画してないと俺は思う
オレオレ定義はチラ裏へどうぞ。
780 :
デフォルトの名無しさん :2011/08/06(土) 21:56:07.91
Cygwinなんですがランタイムライブラリって何ですか?Wikipedeiaみたけど 抽象的すぎてよく分かりません。
781 :
デフォルトの名無しさん :2011/08/06(土) 22:26:52.48
printf を自分で作れない人をアシストしてくれている黒子だよ
デバイスコンテキストには描画できないだろ。 そもそもデバイスコンテキストが何なのかが理解できてないんじゃないか?
>>782 Win32API質問箱 ってスレにいってらっしゃい
まぁ描画というよりは転送だろうけど あえて分かりやすくするために抽象的な表現にしたんじゃないか
785 :
デフォルトの名無しさん :2011/08/06(土) 22:49:10.99
#define __DEBUG__ #ifdef __DEUBG__ #define DEBUGPRINT(format, ...) printf(format, ...) #else #define DEBUGPRINT(format, ...) #endif こういうことやりたいんですが、うまくいきません 何が悪いんでしょうか?
デバイスコンテキストってのは、要するにデバイスを操作する際に用いるTMPやプロパティーのようなもろもろのワーキングデータのコンテナでしょ?簡単に言うと。 そこにフレームバッファーを含めたとしても違和感は無いんじゃないの? GTKしかしらないけど。
788 :
デフォルトの名無しさん :2011/08/06(土) 22:57:03.31
>>786 あ、すいませんDEUBGになってましたね・・・
これを直しても...の部分がそのままになってしまいます
DEBUGPRINT("%d %d %d", 1, 2, 3)
を
printf("%d %d %d", 1, 2, 3)
にしてほしいです。無理なんでしょうか?
__VA_ARGS__
>>789 >>790 ありがとうございました
#define DEBUGPRINT(format, ...) printf(format, __VA_ARGS__)
これでいけました本当に助かります
今さいころでマスを進んでいくすごろくを作っているのですが、 特定の升目で一回休みやマスを戻るという機能をつけたいのですが どうすればできるか教えていただけませんか。
#include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { int num,i,sai; char ps[] = " \n"; char c; srand((unsigned int)time(0)); num = i = sai = 0; while(i != 8) { sai = rand()%6+1; num = i; i += sai; printf("Your number =%d\n",sai); printf("123456789\n"); printf("s G \n"); if(i > 8) { i = 8-(i-8); } ps[i] = '*'; printf("%s\n",ps); ps[i] = ' '; printf(">Dice try (N=end)\n"); c = getchar(); if(c == 'N' || c == 'n') return 1;} printf("you win !\n"); return 0; }
デバイスコンテキストっつーのは画像処理ソフトで使われるレイヤーと同じ様なもん つーかそれだと思えば解釈が簡単
796 :
デフォルトの名無しさん :2011/08/06(土) 23:10:07.49
可変引数を取れる関数って、プロトタイプどうすんの?
int printf(const char *format, ...);
798 :
デフォルトの名無しさん :2011/08/06(土) 23:34:08.56
何が来るか分からんものってプロトタイプでチェックできんの? できなんだら、なんかプロトタイプの意味がねえ気もするが
例えばprintfなら少なくとも第1引数はチェックできるでしょ
ド素人ながらGNUライブラリのobstackのソース読んでるんだけど # define obstack_int_grow(h,datum) \ ( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \ obstack_int_grow_fast (h, datum)) # define obstack_int_grow_fast(h,aint) \ (((int *) ((h)->next_free += sizeof (int)))[-1] = (aint)) このマクロを読んでみると チャンクの範囲を超えてるなら_obstack_newchunkで新しいチャンクを割り当て 超えてないならobstack_int_grow_fastでintデータ(datnum)を書き込むという流れらしいが 3行目の三項演算子の2項目で、_obstack_newchunk関数に引数を渡した後カンマを打って0をつけたり、その後3項目も0にする理由が分からない。 0そのままだと警告でるよね? それから、obstack_int_grow_fastもややこしいけど next_freeが指すポインタをintサイズだけ進ませたものを代入し直して、それに配列アクセスで増やしたintサイズのスペースにaintを書き込む・・・ この理解で合ってるのかな?
>>800 三項演算子は、条件と、条件が成立した場合に返す値と、条件が成立しない場合に返す値を、書かなければならない
例えその値に意味がないとしても、三項演算子である以上は、何か返す値を書かなければならない
別に1でも42でも-567でもいい
> 超えてないならobstack_int_grow_fastで
obstack_int_grow_fastは三項演算子を囲む括弧の外にあるから常に実行されるよ
どの括弧がどこに対応しているのかよく見てみるべき
あとは合ってると思うよ
>>802 解説有り難う。
三項演算子の条件適合値については分かったんだけど
確認用にコード書いて試してみたら
statement with no effect
の警告でたんで0だけ置いたんではあんまり礼儀がよくないコーディングなのかなと…
後は
(_obstack_newchunk ((h), sizeof (int)), 0)
で_obstack_newchunk関数の後にカンマを打って0を置く意味がまだ分からない。
これは_obstack_newchunkが値を返さないから0を置いてるって事なのかな?
>>803 その理解であってる。
後ろの,0はカンマ演算子で、ここだと()で括られた式の値として、
右辺値0を返したかったんだと思う。
そんな事は分かってる、というレベルの違う話だったらゴメン
チャンク!スロース!
>>804 ああ、やっぱりそういう事だったんだね。
丁寧にありがとう。
>>792 マス目配列作って、入ってる値で判断させれば?
0ならただのマス目
1なら1回休みのマス目
2ならスタートへ戻るのマス目
って具合で
808 :
デフォルトの名無しさん :2011/08/07(日) 10:35:13.48
>>803 >これは_obstack_newchunkが値を返さないから0を置いてるって事なのかな?
他にどう解釈しろと?
試しに以下のコードをコンパイルしてみたら、
やっぱり通らなかった(Visual C++ 2008上で C2120 エラーが出る)。
void f(void) {}
int main(void) {int a = 1 ? f() : 2; return a;}
・・・でも、上のコードを
void f(void) {}
int main(void) {return 1 ? f() : 2;}
とすると、すんなり通ってしまったようだ。(警告レベル /W3)
警告レベルを /W4 にすると以下のような警告は出るけど、エラー扱いではないらしい。
warning C4053: '?:' 演算に void 型の式がオペランドとして使われています。
で、調べてみたら、
http://msdn.microsoft.com/ja-jp/library/1e8z2ake (v=vs.90).aspx に、
?: 演算子には void 型の式が指定されています。void 型のオペランドの値は未定義です。
と書いてある。
つまり、"1 ? f() : 2" は未定義だが、エラーではないって事? 本当? 何故?
誰か偉い人、理由を教えてください。
809 :
デフォルトの名無しさん :2011/08/07(日) 14:01:29.07
「未定義」って答えが書いてあるだろ 正しくないので、もしコンパイラがそれを通しても、おまえが自己責任で回避しろってことだ # どこの規格で「未定義」とされているかとは、また別な話
810 :
803 :2011/08/07(日) 14:05:15.75
>807 それ単に三項演算子の使い方を間違えてるだけじゃん int a = 1 ? f() : 2; だと、aに f()の結果(つまりvoid)を入れることになるから、エラー吐くの当たり前。 int型変数にvoid入れようとしてるんだよ。ところが return 1 ? f() : 2; はmain関数の戻り値にf()の結果を入れようとしてるからエラーにならない。 なんかVCはmain関数の場合はvoidを戻り値にしてもエラーにならんみたいだ。 試しに return f(); にしてもエラーにならん筈。
811 :
デフォルトの名無しさん :2011/08/07(日) 15:17:07.98
だから「未定義」はコンパイラがはじく保証すらないんだってばさってばよー
812 :
デフォルトの名無しさん :2011/08/07(日) 15:46:44.21
>>810 >それ単に三項演算子の使い方を間違えてるだけじゃん
>>811 >だから「未定義」はコンパイラがはじく保証すらないんだってばさってばよー
そんな話はどうでもよくて、なぜこれが「未定義」なのか? を知りたい。
間違えてる事(? 以降の2つの式の型に互換性がない)は、
その後の代入演算とは無関係に判断出来そうなものだろ?
これは、規格上、どの項目に相当するの?
そして、それをわざわざ「未定義」としている理由って何?
普通、コンパイル時にエラーと判別するのが不可能とか
困難な場合に「未定義」って扱いにするものだと思っていたけど。
>>812 定義されていないから未定義なだけで
未定義だと定義されてるわけじゃない
>>813 C言語の仕様策定時の「考慮漏れ」ってこと?
>>814 コンパイラ作ってる人が好きにして良いよって、あえてそうしてる面もある
>>812 GCCでは何もオプションつけずにコンパイルすると、
>>808 の下の奴もちゃんとエラーになるよ
error: void value not ignored as it ought to be (無視されるべきvoid値が無視されてないぞゴルァ!)
M$のコンパイラではエラーにしてないだけだろ。
結局自分で調べてみた。。。
JIS では、やっぱりちゃんと規定されていた(6.5.15 条件演算子)。
制約 第2及び第3オペランドの型は、次のいずれかの条件を満たさなければならない。
− 両オペランドの型が算術型である。
− 両オペランドの型が同じ構造体又は共用体である。
− 両オペランドの型がvoid型である。
− 両オペランドが適合する型の修飾版又は非修飾版へのポインタである。
− 一方のオペランドがポインタであり、かつ他方が空ポインタ定数である。
− 一方のオペランドがオブジェクト型又は不完全型へのポインタであり、かつ他方がvoidの修飾版又は非修飾版へのポインタである。
今回のケースはどれにも当たらないと思うのだが?
要するに VC が規格に準拠していなかっただけってオチか。
勉強になりました。
>>803 さん、ありがとう。
ちょっと修正。 <要するに VC が規格に準拠していなかっただけってオチか。 >要するに VC がタコだっただけってオチか。 ま、規格に準拠していなかったらエラーを出す必要があるとは、 謳ってないもんな・・・ その場合、確かに「未定義とする」と定義されているから、 準拠していると言えばしているが、VC がタコであることには間違いない。
>>819 >第1を全く見てないのはわざと?
いや、見たよ。
引用する必要がないから、省いたけど。
ANSI Cの規格ってどっかでタダで手に入らんかな? そもそも紙媒体のでもないような…
>>823 そこがどうして重要なのか、教えてください。
>>820 > 「未定義とする」と定義されている
どこに?
a=x[i++]というのは、 i=i+1をしてからaにx[i]を代入するのですか? それともaにx[i]を代入してからi++するという意味ですか? よろしくお願いします。
aにx[i]を代入してからi++するという意味です ++i にすると意味が変わります
>>827 それぐらい自分で検証してみろよ
というかインクリメントでググれ
もうひとつお願いします。 int check(int x, int y){ int k; for (k=0;k<x;k++){ if(a[k]==y) return 0; } return 1; } という関数が定義されていて、main関数の中でif(check(x,y))という部分があるのですが、check関数の返り値として何回も0が出てきて最後に絶対1が返り値となってしまいます。この場合はどうなるのですか?
>>830 >この場合はどうなるのですか?
★分からない事をなるべく詳しく書いて下さい。
>>832 main関数の中のif(check(x,y))というのはcheck(x,y)が0だったらその後のものを実行せず、1だったら実行しますよね?
この場合、check(x,y)が返り値を何個も返してしまわないですか?
その後のもの、というのはあまり正確な表現ではありません main関数も載せてみてください
>>833 (質問の意図が取れてるか分からないけど)
最初の return で check() 関数は終了するから返り値は一つだけ
return したら、もう続きの処理は実行されない
>>835 ではこのcheck関数内のfor文は意味をなさないのですか?
ソースを難読化するため、例えば SteelArray[ARRAY1_MAX] を ARRAY1_MAX[SteelArray] など、要素と配列名を逆にして書きたいのですが そもそも何故これがちゃんと通るのですか。
なんでそんな構文規則を作ったんですか?
>>837 a[] の中に y と同じ値が含まれているかを一つひとつ確認していく為の for でしょ
無かったら困っちゃうよ
>>843 すみません。読み間違えでした。ありがとうございました。
配列に対するポインタが指せる位置は配列要素+1まで保証しなければならない、という規則があったと思いますが それはオーバーフローにはならないのですか。 配列要素+1には書き込めないような予防措置があるなんて聞いたこともないのですが
>>845 そもそもCには、配列外に書き込めないような予防装置なんか、元から全然ないだろ
a[-12] とか書いても余裕
>>841 7. 5) b)
利点:
・馬鹿よけ。
・直観的。だからバグが出にくい。
欠点:
・会社が馬鹿だと、A氏のような目にあう。
・そういう会社は、成果を LOC で見るので、自分の評価がやけに低くなる。
>>845 このコードを gcc -S とかでアセンブラ出力してみれば分かるけど、
int main() { int foo[] = { 0, 1, 2, 3 }; }
余計なメモリは確保されないし、何の保証も無いよ
849 :
デフォルトの名無しさん :2011/08/07(日) 21:57:21.57
mallocで確保したメモリの本当のサイズって誰が知っとんの? printfなどで、そのポインタの値を見ても「割り当てられた本当のサイズ」ではないよな。
>>845 >配列に対するポインタが指せる位置は配列要素+1まで保証しなければならない、という規則があったと思いますが
ある。その通り。
>それはオーバーフローにはならないのですか。
ポインタが指せる位置が保証されているだけ。
読み書きしなければ、オーバーフローにはならないだろ?
>配列要素+1には書き込めないような予防措置があるなんて聞いたこともないのですが
そんな措置はない。
>>822 draft paperでも構わんのなら、ISO/IEC JTC1/SC22/WG14のページから拾ってこれると思うが。
自分なら int check(int x, int y) は int member(int range, int value) にするなあ 高々テスト問題でも、きちんと分かりやすいコードを書く事は大切だ
ポインタが指せる位置を保証って、ほんなんCのポインタはどこまでも指してしまえる気もするが 分からんのー
int main(void) { int num,i,sai; char ps[] = " \n"; char c; srand((unsigned int)time(0)); num = i = sai = 0; while(i != 8) { sai = rand()%6+1; num = i; i += sai; printf("Your number =%d\n",sai); printf("123456789\n"); printf("s G \n"); if(i > 8) { i = 8-(i-8); } ps[i] = '*'; printf("%s\n",ps); ps[i] = ' '; printf(">Dice try (N=end)\n"); c = getchar(); if(c == 'N' || c == 'n') return 1;} printf("you win !\n"); return 0; } これにます目を増やしてイベントをつけたいのですがうまくいきません。 誰か教えてください。(includeは省略してます。)
Cとは長年付き合ってるつもりだが、分からん事が多過ぎる。
>>849 >mallocで確保したメモリの本当のサイズって誰が知っとんの?
特に決まっていない。
極端な話「誰も知らない」という実装もあり得ると思う。
知る事ができないとreallocしていいのかどうかさえ分からんからのお
>>853 ポインタを進めていくといずれアドレスFFFFFFFFを超えて00000000に戻ってくるだろう
そうなるとポインタ同士の位置関係を < 演算子で正しく比較できなくなるだろう
最後の要素+1まではそのような問題が起きてはならない
つまり最後の要素+1でアドレスが00000000に戻るようなことになってはいけない
+1まで指せる保証というのは、そういった意味
え? reallocするかどうかなら、呼び出し側でサイズを持ってればいいだけでは? mallocで確保したメモリの「本当のサイズ」っていう話題とはまったく別じゃね?
少なくともアロケータは知ってないと reallocで領域拡大したときに古いメモリの内容を 新しく確保したメモリ領域にコピー出来ないと思う
>>860 改めて要求サイズを予約し、旧ブロックを解放する実装だとしても
元の領域の値を複写するのに利用サイズは暗に欲しいような気がする
>>861 そうとも限らない。
領域拡大した際、拡大した領域に何が入るかは不定。
なので、古い領域から新しい領域へ、新しい領域のサイズ分、
(何も考えずに)コピーしてしまえばよい。
そこでSEGVが発生しないようにする等の話は、また別問題。
OSに管理まかせっきりじゃね?>malloc
>>863 あ
許されるなら同じポインタを返す
(領域拡大の際、既存領域の後続が空きで要求サイズに収まってれば、同じポインタを返す)
って実装をしたい場合じゃなければ大きさ知らなくてもいけるのか
reallocはなぜか無駄に処理が遅いから基本使うなって 誰かに言われた気がしたけど妄想かな?
フラグメントしてもいいなら、reallocは必要ないが フラグメント気にするような用途だと使わざるを得ない 最近は携帯電話でも、メインメモリ1GBとか贅沢になってきた
>>863 mallocしたときどれだけの領域が使われたかわからないと、
次にmallocする時、どこからメモリを使えばよいかわからない。
確保領域サイズはmallocが管理しているはず。
freeする時も、mallocした分解放することになるので、
mallocが確保領域を管理しているのでは?
mallocが管理しているか、OSが管理しているかはまた別問題。
単純に考えると、mallocが知ってるはずなんだよな 知ってるはずなのだが聞き出す方法がわからんと。
>>868 >mallocしたときどれだけの領域が使われたかわからないと、
>次にmallocする時、どこからメモリを使えばよいかわからない。
>確保領域サイズはmallocが管理しているはず。
今まで確保した「合計サイズ」が必要だって事だね。
実際、必要そうだ。
けど、malloc の呼び出し毎に確保された
「個々のサイズ」は忘れても良さそうな気がする。
>freeする時も、mallocした分解放することになるので、
>mallocが確保領域を管理しているのでは?
昔の free は、実際には free していなかった
というのは有名な話。こんな実装でも筋は通る。
今の free も sbrk の位置を動かしたりはしてないんじゃないかな
873 :
デフォルトの名無しさん :2011/08/07(日) 23:01:50.73
>>871 実際には free しない free に依存したコードを書く
おまえの頭だけはどう見ても筋は通っていない
それで「標準」ライブラリを使っている気になっているんだろ(プゲラ
10×10の周りをちょうど1周(スタート=ゴール)で終わるオーバーすれば何周 でもするすごろくを作りたいのですが、さっぱりわかりません。 できればマスを戻ったり一回休みを作りたいです。
>>874 7行スレ向けのお題だね。
不幸にして、7行スレはもう無くなってしまったようだが。
>>876 失礼。
>>875 は蛇足だね。
このスレでいいと思うよ。
ただし、たかが「すごろく」とはいえ、
色んな要素が絡むからね。
それなりに難しいのは仕方ないと思う。
>>878 ありがとうございました。
ただ自分の作ろうとしてるのとは違いました。
それは残念 でも面白いお題でした
>>874 現在の数を37マス(10+9+9+9)で割って余りでイベント決めるとかはどう?
入門ならこれでいいとおもふ
10x10 の周囲マスの数は36だろ。
showBoardってどんな意味があるんですか?
874です。 皆さんありがとうございました。
計算で0を出したいのにマイナスの値が出てきます。 これを正しくするにはどうすればいいですか? 初歩的なのかもしれませんが教えてください。
どういう問題なのかはっきりしないが、 「計算結果が0未満になったときは0にしたい」なら条件分岐(if文とか)を使え。 「計算すると0になるはずなのになぜか負の値が出てくる」ということなら その情報だけでは、たぶんコードのどこかが間違っているのだろうから よく確認してみてねとしか言えない。
889 :
デフォルトの名無しさん :2011/08/08(月) 03:43:27.93
>>828 >aにx[i]を代入してからi++するという意味です
>++i にすると意味が変わります
処理系によってはa[i]を参照し記憶し、i++してから
aに代入(複製)することもあるでしょう。
こういう質問に関しては、例示に留めてください。
例
実行前 I=1 a=0 x[1]=3
実行後 i=2 a=3 x[i]=3
ほかに作っているif文のマイナスの値が出てきてるみたいなんですが、 混同しないようにするにはどうすればいいですか。
>>849 mallocの実装例としては、ヒープをunionによるブロック単位で扱い、先頭をヘッダーとして用いて確保ブロックサイズを記録する方法がある。(あくまで実装方法のひとつ)
ヒープメモリー(□は未使用、■は使用中。□ひとつが16byte)
□■□□□□□■□□■■□□□□■■■□□■□□□
例:20byteを確保したい場合。
1.ヒープから20byte分を格納できる連続領域を捜す。
(20byteだから□2個分+ヘッダー用1個=3個以上連続して空いてる場所を捜す)
□■□□□□□■□□■■□□□□■■■□□■□□□
↑
ここが空いてる
そこをヘッダーとして、確保サイズの記憶に用いる。(ヘッダーに”確保サイズ20”をメモする)
□■20□□□□■□□■■□□□□■■■□□■□□□
↑
以降20byteが使用されてるという印
ヘッダーの次のアドレスをmallocの戻り値とする。(ユーザーは、ここ以降20byteを使用して良い)
□■20□□□□■□□■■□□□□■■■□□■□□□
↓
ヘッダーの次の□の位置を、mallocのリターンとして返す。
例:これを free()する場合
□■20□□□□■□□■■□□□□■■■□□■□□□
↓
free()には、malloc()の戻り値の先頭アドレスを渡す。
このアドレスを、□1つ分もどると、そこがヘッダーとして、malloc時に確保したサイズが記録されている。
この20を参考にして free()は動作する。(ヘッダーのリンクをリセットする)
備考:実際にはサイズの20だけではなく、次の空き領域へのポインターも同時に格納されてるかもしれない。(あくまで実装方法のひとつ)
a = malloc(20)で得たaを、適当に数バイト後ろに戻って、記録されてるデータを確認していけば、20という数字が見つかるかもしれない。
>>891 もっと詳しく言うと、実際アライメントの調整するから20バイトきっかり確保される事は無いな。
アライメントが8だと24バイトになるね。
実装になってない。 一番重要なのは使用済みor未使用を区別する手段だろ。
> 次の空き領域へのポインター
VC++でファイルリスト作成に1ファイル毎にmallocやったら途中でエラー起きた。 5万回mallocはムリだったか。
Mr.Malloc うっうっうっううー
898 :
デフォルトの名無しさん :2011/08/08(月) 16:08:53.98
AdobeReaderって何であんなに頻繁にアップデートすんの舐めてんの
しかもそのたびにデスクトップのアイコンが復活しやがる
まじふざけんな
ちょっと前にセキュリティ関連のバグ出したからなあw
>>898 >>896 がどう malloc() してるか知らんけど、1KB づつ malloc() しても、
高々 50MB 程度だから、32/64bit の問題じゃないと思う。
905 :
デフォルトの名無しさん :2011/08/08(月) 17:22:31.96
初心者です、教えてください。 VS2008でオプション→VC++ディレクトリ等で出てくる $(VCInstallDir)のようなマクロを自分で作ることはできますか?
906 :
デフォルトの名無しさん :2011/08/08(月) 17:33:13.83
>>904 まあな
昔 malloc の実装を作ったときも、そんなあたりに壁はなかった
小間切れ領域が足りなくなったときの処理がタコとか・・・まさかねw
おおかたパーミッションあたりか
>>905 Cのプログラムの中での話?
もしかしてすれ違いならVisualStudioやVC++のスレあるよ
>>906 malloc にパーミッションなんてあったっけ?
君のクラスの一番後ろ 一番うしろ
>>906 タコっつうか、実行速度最優先で断片化を防ぐことはあまり考えてない気がする。
断片化しちゃったら終わり。どうしようもない。
パッパッパッパ
教えて下さい! ファイルから数値を読み込みたいのですが, 数値の数を可変にしたいのです。 int dim;int *F; を変数として,ファイル input に 3 14 2 7 の様に、一行目に 変数 dim の内容を、 二行目に dim個の数値(*F の内容)を記述してあって、 それを読み込みたいのです。 fgets(s,64,fp); sscanf(s,"%d",&dim); で、一行目の読み込みは出来るのですが、 二行目をどう読み込めばいいでしょうか?
とっんがり〜くっちっばっし こっとりさん〜ことりさん♪
>>914 Fの領域を確保してから
for(i=0;i<dim;i++) fscanf(fp, "%d", &F[i]);
今日からc言語を学習します とりあえずコンパイラとnotepad++入れとけばいいんだろ?
918 :
デフォルトの名無しさん :2011/08/08(月) 23:34:54.26
>>917 Turbo C 2.01 オススメ。
ライブラリは充実してるし、
統合開発環境も付いてるからインストールしてすぐ始められる。
LCC-Win32 もオススメ。
商用利用しなければ無償で使えるから経済的。
もろちん開発環境も付属。
VC++2010 も一応オススメ。
ただしこれは C コンパイラーじゃなくて
C++ のコンパイラーだね。
普通に Windnws SDK 7 使っとけよ。
922 :
デフォルトの名無しさん :2011/08/08(月) 23:51:03.82
VC++2010ってc++だけなの?cもビルドできるぽいが
あげちまったすまん とりあえずLCC入れとく
cもできるよ。
VC++2010も入れとけ。 両方使ってみて気に入ったほう使えばいい。 多分こっちがメインになる。 Turbo C は不要。これ16ビットだからな。
C++のソースがムカつく Somehow::YOYOYOYO こういうのがムカつく Cの参考書に書いてないじゃないのさ。C++分からないのに
全部いれとけばいいよ 一つのソースをいろんなコンパイラに通してみるのも 意外と楽しいし発見もあったりする
ダブルコロンはセンスがない
じゃあ C machine もだな。w
linuxでgcc使うのが、Cを楽しむ最良の選択だと思うわ。 linuxだと、モニターの表示映像もファイルだから、fopen("/dev/fb0", "rb")とかで適当にファイルを開いて、 そこにfwrite()で、各ピクセルの色を書きこめば、それだけで画面に絵を表示できる。 サウンドも、グラフィックと似たような方法で直接鳴らす方法もある。 windowsだと、こうはいかない。 windowsだと、手軽にできる画面出力なんてprintfくらいだから、 結果的に、「Cだとprintfで文字表示するくらいしかできない。グラフィックやサウンドは極端に面倒」的な、妙な認識になりがち。
確かにlinuxは面白いね 設定さえ済んでれば、これだけでキャプチャもできるもんな cat /dev/video0 > capture.mpg
>>928 御意
Lispみたいにシングルコロンとダブルコロンが意味的に繋がっていれば、まだわかるんだけどね
マジかよ眠ってるネットブックにlinuxぶち込んでくる
rで開いて書き込むのか。 変な仕様だな。
::の機能って、Cで完全に代替できなくて困る あるものはchar*で代替できるかもしんね でも全部がそういうふうに置き換えられるわけじゃない やれやれだ
;;
_
940 :
デフォルトの名無しさん :2011/08/09(火) 11:04:03.06
941 :
デフォルトの名無しさん :2011/08/09(火) 18:06:25.05
C言語って、matrix演算ってあまり得意ではないよね? ライブラリはあるみたいけど、自作してOKなのかな?
_ /,.ァ、\ ( ノo o ) ) )ヽ ◎/(. (/.(・)(・)\ (/| x |\) //\\ . (/ \)
8G弱のファイルを処理するために、fopenで書いてた部分をそのまま fopen64に直したんですがうまくいかないです。 ファイルポインタの宣言を別なものにする必要とかあるんでしょうか? それとフォーマット指示子なんですがlongは%ld、floatは%fなんですが doubleやlong doubleはどう指定すんでしょうか?
>>944 環境は何よ?
> floatは%fなんですが
違う。
>>945 環境はSolalisです。
%eとか%gとかもあるということです?
#define _LARGEFILE_SOURCE #define _FILE_OFFSET_BITS 64 これ指定するだけで特にいじる必要ないってことであってます?
948 :
デフォルトの名無しさん :2011/08/09(火) 20:51:29.26
>>941 3x3、4x4とか小さい固定サイズのは自作してもいいけど大きいのはなあ
頑張って自作した後に有名なライブラリとパフォーマンス比べてみると死にたくなるよ
>>944 longが32bitで、fseek()とかftell()みたいな関数つかってるとかは?
950 :
デフォルトの名無しさん :2011/08/09(火) 20:54:14.57
C はアセンブラやハードの出番がきたときあっさり対応できる人向けの言語だからな
>>949 fseekやftell使ってます。ダメですか?
>>951 もしlongが32bitだったら2Gまでしか処理できないね。
fopen64()って関数があるんならfseek64()みたいな関数もありそうだけど。
fpos_t みたいなの使えば問題ないはず
gcc -m64 とか?
流れに割ってはいるけどfprintfって2G以上のファイル出力出来る? 書き出すだけだから出来るんかな?
その1. FILE構造体の実体実装次第っぽい気がする その2. まず想定しないだろうけど fprintf(fp, "%s", string) でフォーマットで参照する文字列 string が 2G 突破しちゃうようなでかいの
gccって「グシシ」みたいに笑ってる感じに見えるから 物語だったらC言語は間違いなく悪役
gnu compiler collection
まさかのマジレス
962 :
デフォルトの名無しさん :2011/08/09(火) 23:01:16.81
961見て思ったけど今C言語使うとかM4とAK-47があってAK-47取るようなもんだぞ そりゃある程度の知識としては必要なんだろうけど
963 :
デフォルトの名無しさん :2011/08/09(火) 23:08:30.10
自己満足を表す東洋語の自慰を冠する UNIX ライクなツールチェイン それに飛びついたコバンザメたちの大漁にお堅いメーカーまでが寄らば大樹の陰と、ある意味の本末転倒 独創的でしかし新旧問わずフリークたちのツボを真に抑えた文化圏ができるまでの腰掛けに過ぎない 社の面子だけが最終課題の、無駄に複雑でいらんことを勝手にする、 その使いにくさのあげくがセキュリティ形骸化という馬鹿げた事態への アンチテーゼではなかったのかという、絶望の向こうにあるまた絶望
961 見て思った事 OCaml は C++ と同じくらい汚いと思う Scala は VM で動く言語だから C とはレイヤーが違う SML が栄えていたら C は要らなかったかも C++ が C with Class のまま穏当な進化をしていたら C は要らなかったかも C が要らないと思う人は、使わないという勇気を持てば良いだけ
966 :
デフォルトの名無しさん :2011/08/09(火) 23:14:02.86
>>964 そうじゃないけどなんでアラビア語?なんだ
ぶっちゃけC言語だけで何でもできる ゴミ言語が乱立したせいで混乱を招いてる
968 :
デフォルトの名無しさん :2011/08/09(火) 23:20:38.17
VBディスってんのか
>>965 OCamlの汚さ - SMLの汚さ = C++の汚さ - Cの汚さ
であって、流石にOCamlがC++と同じくらい汚いってことはない
むしろMLベースでC++並みにカオスな言語とか使ってみたいわ
970 :
デフォルトの名無しさん :2011/08/09(火) 23:46:10.94
人工生命らしき物体をつくろうとしてるんだけど マルチスレッドに関するいい資料とかあったら教えて下しあ あとコレ便利だけど?みたいな関数とかも教えてくれたら神として崇める ちなみに開発環境はVisual Studio 2008 c++です 開発環境もこっちのが良いんじゃねみたいなのあったら教えてください
いまさらコンパイル型の言語なんか使ってる時点で駄目だろ。 どんな移植性が良くたって、結局は生成されたモジュールが環境依存なんだからな。 Java みたいのは本末転倒だ、話にもならない。 ソースコードそのものがそのまま実行ファイルであり、 どんな環境でもそのまま使える Perl や Ruby こそ本来の目指すべき未来だろう。
/* 無意識のうち ああ求めてる "メビウスの輪の中" 精神を操る黒幕 "Rebuild" */
974 :
デフォルトの名無しさん :2011/08/10(水) 00:11:26.05
>>970 そういうのはループの局所的な並列化だけでいいはずだからOpenMPが楽
>>971 その位の理由ならJavaもPerl や Rubyも同じようなもんだろ
>>944 問題を再現出来るミニマムなコードを貼ってくれたら・・・
978 :
デフォルトの名無しさん :2011/08/10(水) 03:32:15.18
979 :
デフォルトの名無しさん :2011/08/10(水) 03:50:49.69
OpenMP調べてみたけどシングルコアだと遅くなっちゃうのかね? マルチコア最強になっちゃう感じですか? すみませんド素人なもんで
>>979 なっちゃうかもしらんが、個人的にはシングルコアでも差が分からんかった
コンパイラオプションでON/OFF選べるよ
981 :
デフォルトの名無しさん :2011/08/10(水) 03:58:53.43
>>980 返信はやくてびっくりしたわ
さんくす
いろいろ試してみるわ
次スレ立てます
985 :
デフォルトの名無しさん :2011/08/10(水) 07:35:22.39
メモリが512MBでPen4の2kがあるんだけどプログラミングに使えそうかね
マザボにSATAあるなら。 PCIのギガビットLAN+SATA増設は鬼門。 フルにアクセスするとマウスがワープしはじめる。
そっちのIDEかよw PCIのバス幅ならSATAカードやNIC増設したらそうなるかw
まともなマシンならならねーよ。
マシンって何だよwww AGPがまだまだ主流の頃のM/Bのチップセットなら ありえるかなと思ったけどそこまで調べるの面倒だ
コピーしています。 残り917727分
double aaa() { double aaa = 5.552; return aaa; } void main() { printf("[%lf]\n",aaa); } とすると、[0.00000]が表示されます。 なぜ? doubleの戻り値が取れません。int型なら問題ないのですが。
printf に渡してるのは 関数のポインタだもの × printf("[%lf]\n",aaa); ○ printf("[%lf]\n",aaa());
void main() { printf("[%p]\n",aaa); } こうしないと駄目だろ。
すみません。printf内では、 aaa() で呼んでました。 実際は、aaa()は別オブジェクトで静的にリンクしてるのですが、 double aaa(); とプロトタイプを書けば戻り値の取得をが出来ました。、 でも、 int aaa(); ならプロトタイプを書かなくても取得ができます。 これはなぜでしょうか?
C言語って、BASICで言うCLSみたいなのはどう書くんですか?
system("cls"); system("clear");
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。