以下、質問と回答以外禁止
好きな食べ物は何ですか?
魚かな。ほら、やっぱりシーだから。
Windows OS/NT系 は、西暦何年まで時計持ってますか?
うどんかな。スパゲッティはあまり好きじゃない
>>4 誰が上手いこと言えとw
金比羅ゴボウとか。
こんぴらごぼうってなんですか? 京野菜ってわけでもないですよね
>>1 乙。
>>2 以下というからには>2で既にその禁止条項が破られている。
>>3 板違い。プログラマの嗜好を聞きたいならマ板へ。
>>4 川魚はどうか。
>>5 PCが壊れない限り時計はいつまででも持つだろ。正しいかどうかは兎も角。
>>6 蕎麦はどう?
>>7 それを言うなら旨いだろ。
>>8 金毘羅さんは香川県にある神社だ。
>>10-
では質問と回答と、それらからの派生の話をどうぞ。
10 :
デフォルトの名無しさん :2011/05/02(月) 16:01:17.90
以下のプログラムで、ディレクトリの区切り文字を"/"と両方使えるようにする ためにはどのようにすればいいでしょうか? 教えてください。よろしくお願いします。 void get_dirpath_filename2(const char * src, char * dirpath, char * filename){ char const * const lastSlash = strrchr(src, '\\'); if (lastSlash == NULL) return; sprintf(dirpath, "%.*s", lastSlash == src ? 1 : lastSlash - src, src); sprintf(filename, "%s", lastSlash + 1); }
>>9 こんぴらさんは知ってます。知ってるどころか地元なので蕎麦よりうどんが好きです。
マジレスすると
>>7 は全スレのこんぴれ→金比羅(→金刀比羅)→きんぴらだとおもうけど、
こんぴらときんぴらは関係ないんだといいたかったんです。
けれどこんぴれとこんぴらも関係ないので、金比羅ごぼうをきんぴらごぼうと解釈しても
問題のない場面だったのかもしれません。
>>10 strrchr(src, '/')も取得して、いずれもNULLではなかった場合、比較してより後ろの方を採用すればどうでしょうか。
>>10 void get_dirpath_filename2(const char * src, char * dirpath, char * filename){
const char *lastSlash = strrchr(src, '\\');
if (lastSlash == NULL) {
lastSlash = strrchr(src, '/');
if (lastSlash == NULL) return;
}
sprintf(dirpath, "%.*s", lastSlash == src ? 1 : lastSlash - src, src);
sprintf(filename, "%s", lastSlash + 1);
}
/ を \ に置換かけてからその関数通す のは無し?
>>13 それもいいかもね。
srcと同じサイズのバッファを用意して、コピーして置換かけてって
操作が必要だからCだと、シンプルさに欠けるかもしれない。
あとdirpathに書き込むとき、元に戻す操作も必要になるかも。
16 :
デフォルトの名無しさん :2011/05/02(月) 17:11:08.22
フォルダとファイルの見分け方があったら教えてください。 よろしくお願いします。
>>16 C標準ではありません。
例えばディレクトリとファイルが同名で同時に同じディレクトリ内に存在できる変態OSも在り得るので、標準で用意できないのです。
>>16 模範解答:
フォルダのアイコンで表示されているのがフォルダ。
ファイルのアイコンで表示されているのがファイル。
19 :
デフォルトの名無しさん :2011/05/02(月) 17:35:34.70
#include <windows.h> #include <tchar.h> #include <shlwapi.h> #pragma comment(lib, "shlwapi.lib") BOOL IsFile( LPCTSTR _name) { WIN32_FIND_DATA FindData; HANDLE hFind = FindFirstFile( _name, &FindData); if(hFind == INVALID_HANDLE_VALUE) return 1; FindClose(hFind); if(!(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) return 0; return 1; } int main(){ char str[256]; LPCTSTR temp; scanf("%s",&str); temp=str; printf("%d\n",IsFile(temp)); } これでどうでしょう?
20 :
デフォルトの名無しさん :2011/05/02(月) 17:45:11.65
鍵の人元気かな?
21 :
デフォルトの名無しさん :2011/05/02(月) 17:47:33.60
ホストがファイルシステムを持つべきと C の規格が主張するのも逆だしな
>>19 見事に TCHAR の意味を分かってないな
昔の自分のようだ
いまさらwin9x対応もないから、TCHARとか使わんほうがいいと思うけど。 (昔から有効に使われてなったけど)
winでマルチバイトでキンピルする奴なんて極少数派だよな
また造語使いが表れたか いままでの経験からするとアレだな
26 :
デフォルトの名無しさん :2011/05/02(月) 21:53:26.89
プログラム初心者です. 砂の挙動計算(堆積,風による移動,衝突など)をしたいと思っています. アドバイスください.あるいは参考にできそうなページあれば教えてください. 計算方法はルンゲクッタ法を使い,剛体球モデルを用いる予定です. 特に悩んでいるのは砂の初期配置についてや,無数の砂をどのように計算するか,です. よろしくお願いします.
CでやるよりC++以上でクラス・オブジェクトの概念の組み込まれてる言語の方がよさそう
ポインタについて質問です。 char *ptr = "string"; →「ptrは"string"の先頭アドレス('s'が保存されているアドレス)を参照しており、*ptrで's'を取り出すことができる」 char ptr[] = "string"; →「このptr自身も先頭のアドレスを参照しており、*ptrで's'を取り出すことができる。ptr[0]にするとアドレスの内容になる。」 上記の解釈で良かったでしょうか?つまり一緒ですよね? また、両方ともアドレス上に連続して's', 't', 'r', 'i', 'n', 'g', '\0'が1文字ずつ並ぶと考えて良いですか? て違うのでしょうか?
メモリの確保先が違う
>>29 char *ptr = "string";
こっちは、文字列がどっかの領域にあってポインタにはそのアドレスが入る。
char ptr[] = "string";
こっちは、配列が確保されてそこに"string"がコピーされる。
>>29 よくある勘違いだな。
char *pはポインタ型の(だいたい4byte)変数に、アドレスの値が入ってる。
char a[]はcharの固まりという型?の(文字列数n byte+終端文字1 byte)変数に、モロに文字列が並んでいる。
int main() {
char *p = "abcdefg";
char a[] = "hijklmn";
printf("%d %d\n", sizeof p, sizeof a); // 変数のサイズをみてみよう
printf("%p %p\n", p, &p); // 値と、変数pのアドレス
printf("%p %p\n", a, &a); // ポインタに成り下がった変数の先頭アドレスと、変数aのアドレス
}
ただ、配列はちょくちょくポインタに成り下がるので注意。
関数に配列名を渡した時、関数内では単にポインタとして扱う。
詳しくは「エキスパートCプログラミング」って本を参照されたい。
C FAQを参照すればいいレベルのような
34 :
デフォルトの名無しさん :2011/05/02(月) 23:14:27.37
> だいたい4byte エキCの読者層も広くなったものだな
どういうことです?
char *ptr = "string"; ptr[0] = 'a'; ができないことの説明になってないんだよな
文字列リテラルは、コードセグメントに領域を持つ、と?
38 :
デフォルトの名無しさん :2011/05/02(月) 23:35:12.86
>>36 できることとやっていいことの区別くらいしような
>>23 それだといちいち MessageBoxW とかやらないといけないから面倒だろ。
>>39 それでもいいんじゃない?
TCHARを使っていても、
>>19 みたいに片方でしか動かないコードって
気持ちわるいじゃん。
ぱっと見た目でワイド文字対応って分かるとすっきる。
まあ世の中のTCHAR使ってるコードの95%は片方しでしかコンパイルできない
コードだろうけど。
>>40 >世の中のTCHAR使ってるコードの95%は片方しでしかコンパイルできない
それでTCHARを使う意味あるのですか?
>>41 他人が書くコードなんてどうしようもないだろ
>>41 俺は意味がないと思ってるから
>>23 みたいに人には勧めていない。
さらに言えば、文字の編集があるところでマルチバイト文字、ワイド文字と
両方で動くように意識してコードを書いてる人はさらに少数派だろうし、
両方でコンパイルしてテストまでしてるところとなるとほぼゼロだと思う。
44 :
913 :2011/05/03(火) 04:44:06.79
前スレの穴を空けたいとかで質問してた野郎なのだが・・・ if(x>=12 && x<=14 &&y>=12 && y<=14)break; みたいに逆にしたらできた。ちなみに二重for文で書いてた ■■■ ■□■こんな感じに(図) ■■■ みんな懸命に答えてくれてありがとう。参考になった 説明が悪いとか情報を小出しにすんなとか話が違うとか思ったらすまんこすまんこ
45 :
29 :2011/05/03(火) 08:09:01.86
>>30-32 ありがとうございます。
どちらも値を*(ptr+i)、アドレスを(ptr+i)で表示させてみたらアドレスも1バイトずつ進み結果が同じになったので、てっきり同じかと思ってしまいました。
まだ
>>32 の最後のprintfがなぜ同じアドレスになるのかが理解不能なので勉強しなおします。
「ポインタに成り下がる」という言葉も初めて聞いたくらいなので。
「ポインタに成り下がる」は特に気にしないでいい ただのその場の言い回しだろう
変数pはあくまでポインタを格納する変数 アドレス p 0xどっか ↓ ↓ 値 0xどっか "abcdefg" 変数aはchar型配列を格納する変数 アドレス a ↓ 値 "hijklmn" pの場合、格納している値(p)と自分自身のアドレス(&p)は違う aの場合、配列を格納する変数に添え字をつけないと配列の先頭アドレスを示すので、 配列の先頭アドレス(a)はaのアドレス(&a)と同じになる
>0xどっか 別に0xをつけなくてもどっかはどっかだよ。 アドレスは習慣的に16進で扱うことが多いけどそこに意味はない。
49 :
29 :2011/05/03(火) 08:48:01.53
>>46-47 ありがとうございます。
>>47 の上の図でなんとなくわかったかも。
char str[] = "ABC"
char *ptr = str;
と
char *ptr = "ABC";
は同じってこと?(どちらもptrは"ABC"が格納されている配列の先頭アドレスを指す?)
>>32 sizeof演算子はsize_tになるから、そのまま%dで受けるのは宜しくない。
intでキャストするのが無難。
可変個引数のルール理解してないのか。
>>51 >50に言っているとしたら、あんたがね。
>char ptr[] = "string"; これ気持ち悪いから好きじゃない。 初期化時だけの特殊ルールだし。 せめて char ptr[] = {"string"};こういう表記にしてほしかった。
>>39 なんかグダグダだよな。
使う時の定義は
MBCS ←→ UNICODE
なのに、APIのサフィクスは
〜A(ANSI) ←→ 〜W(wide character)
だもんな。
そも、Unicode っても UTF-16 だと決め打ちだしな。
>>49 その解釈でOK
ポインタに成り下がるっていうのは関数の仮引数に配列名を渡したときに起きること。
今はあまり気にせずそういうものだと覚えてしまったほうがいい。
Cで一番やっかいな箇所だと思う
>>53 それ言うならポインタ変数の宣言の仕方もなんだかなあと思う。
アドレスの値を取り出すのと同じなんだぜ
そりゃ初学者が混乱する
文字列の扱いに関してはほんとCって決まり事ばっか多くてダメな子だな。 というか使う人間がダメな子だとどうしようもない状況に簡単に陥るというか。 VBならStringで宣言しときゃ可変長で1バイト文字だろうがなんだろうがバンバン詰め込めるし簡単。
>>55 >アドレスの値を取り出すのと同じなんだぜ
同じだから良いんじゃん。
type* var; みたいに書くアホにはそれが解ってない。
>>56 .net以前のVBもすでにワイド文字化されてて、文字列の長さを
求めるのにLenとLenBと二つになってたり、グダグダ感がある。
>>45 ポインタに成り下がるについて説明したいと思います。
少し難しいので、
>>55 さんが言うように、今は結論だけでもいいかもしれません。
実は私もこのことを最近知ったので、識者の方、間違いがあれば訂正願います。
char a[]で、aは、char[]型なんだけど、3つの場合を除いて、aがchar*型になってしまう
ということです(このことをポインタに成り下がると表現する人がいます)。
具体的には、a == (char*)&aのようなことが起こります(aのアドレス(&a)を取得して、
&aはchar(*)[]型なので、char*に変換)。
char a[]は、char*型になってしまう場面のほうが多いため、aをchar*型であると勘違いす
る初心者は多いです(私もそうでした)。
>>32 の例文で以下のようにポインタを1つ進めてみると違いが分かるかもしれません。
printf("%p %p\n", a, &a); // ポインタに成り下がった変数の先頭アドレスと、変数aのアドレス
printf("%p %p\n", a + 1, &a + 1); // ポインタを1つ進めてみると
type& var; のほうが意味的にわかりやすい気がする。 type& var1, var2; でvar1もvar2もtype&になると。
>49 違う。 下は配列を指していない。 書き換えできない領域を指している可能性がある。 >55 >ポインタに成り下がるっていうのは関数の仮引数に配列名を渡したときに起きること。 配列からポインタへの生成は、いくつかの例外を除き常に起こる。 K&Rの参照マニュアルA7.1を引用すると 式がTの配列であれば、式の方はTへのポインタに変更される。 この式が、単項&の演算子、あるいは++,--,sizeofの被演算子、 あるいは.演算子の左演算数の物であれば、この変換は行われない。 >59 >a == (char*)&aのようなことが起こります 配列の先頭要素を指すポインタだから、 a => &a[0]の方が適切だと思います。 char a[10]; の時に&aはchar[10]を指すポインタ(型はchar (*)[10])というあたり、 配列とポインタの関係性を把握する関門だと思ってます。
>>50 %u って知ってる?更にC99が使えるなら %zu にすれば完璧
>C99が使えるなら
>>50 はどういうこと?
暗黙でsize_tからintに変換されるけど先に明示的にintでキャストしたほうがいいってこと?
暗黙で変換されない場合があるからキャストした方がいい
ポインタに成り下がるという表現はよく誤解を招くけど、C FAQでも使われる言葉なので知っておくといいかと。 定期的に議論になるので、あまり良くない言葉だったのかもしれないけどね。 配列へのポインタが、配列の先頭要素へのポインタに変換されることをいう。
厳密にはsize_t とintのバイト数が等しいとは仮定できないじゃなかったけ
>>56 一体C言語がつくられたのがどれだけ昔で
マシンパワーがどれくらいだったかと思っているんだ。
charもintもポインタの場合はサイズが同じだと思うんだけど それぞれの型で宣言するのはポインタ演算を実現させるため?
>>64 一番新しい規格はC99だよ?いつまで古い規格にしがみついてるの?
>>68 俺の今使ってる環境では厳密にはどころか実際に等しくないぞ
size_t=8バイト
int=4バイト
>>71 charr* と int* のサイズが違う環境って例えば何?
>>75 えっ? すると「サイズが違う場合もある」は規格か何かに明記されてるってこと?
はいはい揚げ足取り揚げ足取り アンタが一番Cについて良く知ってるよ、そういう事にしといてやる。
>>76 char *p = "…";
int *n;
n = (int*)p;
p = (char*)n;
これやってpの値が元にもどる保障がないってのは、サイズも含めて違う場合も
あるって思ってるけど。
いや、サイズも「含めて」なんて言い方じゃなくて、 「サイズが違う場合もある」かどうかそのものが焦点じゃね。
>>78 ANSI-Cに準拠していない化石マシン用コンパイラの話ですか
JIS X3010:2003の6.3.2.3 ポインタ
voidへのポインタは, 任意の不完全型若しくはオブジェクト型へのポインタに,
又はポインタから, 型変換してもよい。任意の不完全型又はオブジェクト型への
ポインタを, voidへのポインタに型変換して再び戻した場合, 結果は元のポインタと
比較して等しくなければならない。
16bitの時代はfarとかnearとか付いてて、ポインタのサイズが違ってたとかはある。 そういう修飾がなくても、データのポインタと関数のポインタならサイズが違ってた。
>>66 あ、そっか。
intより小さい整数型だけintに変換されるんだね。
>>82 関数型ポインタじゃなくてintとcharのポインタの話しなんですけど…
>>81 それは例えば int* → void* → int* とかができればいいわけだから、
void* がどのポインタ型も納めれるくらい充分に大きなサイズがあれば問題なく満たせるよな
もし int* が void* より小さかったとしても、その規定に反しないよな
>>79 これが保障されないのはサイズの問題じゃなくて、アライメントの問題なんじゃ?
んー、勉強になった(ような気がする)。 するとよく見かける glibc の memcpy とかの実装(アライメント調整して後は unsigned int で転送) とか言うのはポータビリティが無いのか
89 :
デフォルトの名無しさん :2011/05/03(火) 12:57:04.45
>>51 50 は何かおかしいこと言ってるか? 「無難」という文言が俺は好かんが
>>74 i8086/MS-DOS では、場合(メモリモデル)によっては、int *, と int (*)() が違うことがありました。
コンパクトメモリモデルなら、たしか sizeof(int *) == 4, sizeof(int (*)) == 2 だったかな。
keta以降の少数を切り捨てる関数を作ったのですが ketaに-6とかを入れて少数6桁目以降を切り捨てようとしても 出来なくなります。 どうすればいいでしょうか。 double cutKeta(double value,int keta) //切り捨てる { double tmp; tmp=pow(10.0,(double)keta); value/=tmp; value=((double)((int)value))*tmp; return value; }
・1回sprintfで文字列に落としてから、sscanfで数値に再変換する。 ・小数点より上位は別にしておいて、小数点以下を10^k倍して、整数に入れる。 それから上位と10^-kを掛けた整数を足す。 ーーこんな感じのアイデア2個
1つ目は論外
>>93 >value=((double)((int)value))*tmp;
value = floor(value) * tmp;
>>93 例えば、小数部分を切り落とす関数floorがあるので、これを使う
10^n倍すればn桁ぶん値が「ズレる」ので、任意の位を切り落とすことができる
負の値に対してはうまく動かないので注意
#include <math.h>
double cutKeta(double value,int keta) //切り捨てる
{
return floor(value * pow(10., keta - 1)) / pow(10., keta - 1);
}
ポインタに成り下がるっていう言葉があったのか
朝適当なこと言ってしまったな見た人言った人すまん
>>95 なるほどと思ったんだけど論外なの?
>>94-97 レスありがとうございました。
もう少し調べたら少数7桁まで切り捨てれるのですが
8桁目以降が残ってしまうようです。
floorを使ったら切り上げの問題が解決できたけど
少数8桁目以降が残る問題は解決できませんでした。
固定小数
>>99 精度の問題。
double const pow10 = pow(10., (double) keta);
return floor(value / pow10 + 1e-15) * pow10;
とでもしてみたら? 1e-15は適宜調整と言うことで。
>>98 私は論外とまでは思わないけれど。
でもまぁ、文字列バッファのサイズを幾つにしたら安全になると思う?
そういった諸々を考えると↑で重い処理はfloor()とpow()位だから
文字列処理するメリットはないよ。
つまり論外
>>101 そうか必要バッファサイズが引数依存になってしまうのか 理解した
俺も実装する前にこれくらいは気がつく頭にならないとなぁ・・・
104 :
93 :2011/05/03(火) 22:54:25.42
>>101 レスありがとうございます。
やってみたけど変わりませんでした。
+ 1e-15は何のためにやるのでしょうか。
doubleを処理するのに、そんなに文字列バッファサイズ必要なの?
>>105 ヒント: cutKeta(1e100, 10)
>>106 馬鹿正直に展開しなければ、良いんじゃないの?
>>108 だから、どこで制限するとか考えるくらいなら数値処理でいいでしょってのが>101の主張。
尤も、その数値処理も誤差の問題をクリアできないようだけど。
これでいいだろ double cutKeta(double value,int keta) //切り捨てる { return value-fmod(value, pow(10.0,(double)keta)); }
ここのハッカーの皆様に挑戦状を叩きつけます %20leo.%20h%20PdHr%20%21ePlo%21Ilkwil これはとある文章を暗号化したものです これを解読できますか? これ結構強いと思うので敗れる方がいなければ暗号化技術をオープンソース化します Google Codeに掲載する予定です(破られなければ)
マジレスすれば 結構強いと思うだとか 破られるのか破られないのかよく分かんないんじゃ使いものにならないよ
暗号関連てどうして定期的にバカが湧くんだろうな。5月だからか?
UTF-8 ってワイドなのかマルチなのかどっちに分類するんだ? 個人的にはワイドに分類だと思うんだが。
やっぱここの人たちでも解読できないんだな ありがとう
>>120 ワイドはwchar_tでUTF-8を扱うやつはいないだろ。
まちがった。 「wchar_tでUTF-8を扱うやつはいないだろ。」 だ。
>>121 とりあえずネットのゴミをこれ以上増やすな
ただでさえ不要なコンテンツが検索引っ掛かってウザいのに
UTF-8 は扱いにくいね
>>120 UTF-8 は可変長バイトの文字符号化形式。従ってマルチ。
ちなみにUTF-16もサロゲートペア表現があるので厳密には可変長バイトの
文字符号化形式でマルチなんだけど、一般的にはワイドと言われている。
128 :
93 :2011/05/04(水) 14:28:30.12
皆さんレスありがとうございました。
>>110 やってみたけどダメでした。
誤差はfloorではなく最後の掛け算で発生するみたいです。
>>107 >>111 やってみたけど結果は変わりませんでした。
>>128 ってことは有効桁以上を求めてるのか
long double で誤魔化すのが楽かな
誤差と制度の問題だからdoubleを使う限り不可能
131 :
94 :2011/05/04(水) 14:45:00.84
なにがダメなのか、予想結果と実行結果が要るんじゃないか?
doubleというか浮動小数点を使う限り不可能
単純に、doubleで割ったり掛けたりしてるから誤差がでるんでしょ。
>>133 計算抜きで直に代入しようとしても無理ってことだよ
実数の切り捨ては仕様調べてビット演算子したほうが速いよ
>>136 お前もレス読んでない人か
その方法は10進数基準での切り捨てには使えないだろw
138 :
93 :2011/05/04(水) 15:32:42.35
>>131 double a=1.2345678912345;
a=cutKeta(a,-6);
結果予想
a=1.2345670000000000
実行結果
a=1.2345670461654663
>>138 これだとどうなる?
#include <stdio.h>
#include <math.h>
double cutKeta(double value,int keta) //切り捨てる
{
return value-fmod(value, pow(10.0,(double)keta));
}
int main(void)
{
double a=1.2345678912345;
a=cutKeta(a, -6);
printf("%.30f\n", a);
return 0;
}
mallocとcallocは何故引数の数が違うのですか?
>>140 第二引数の値を内部で利用してるからじゃね?想像だけど。
142 :
93 :2011/05/04(水) 15:43:11.57
>>139 visualC++のデバッガを使ってみてたので
printf("%.30f\n", a);は使ってないですが
a=1.2345670461654663になりました。
>>140 関東の某大学の金曜の単元とってる人、宿題乙wwwww
>>140 こんなの宿題でるの?
正解とかあるのか。
146 :
93 :2011/05/04(水) 15:49:29.92
>>139 printfで調べてみたら1.2345670000000000になりました。
デバッガが悪かったのでしょうか。
>>143 質問した者ですが、偶然にもそんな宿題を出した大学があったんだ
>>146 デバッガは正しいと思うが、
>>142 が指摘してるようにdoubleになってないように思う
1.234567をfloatに入れると丸め誤差が発生して1.23456704616547...となる
インターフェースの不統一に至った歴史的経緯が何かあったんだろうけど 英語のwikipediaレベルじゃ何も書いてないな
>>140 どうせ
mallocは領域全体のサイズを引数として取るのに対し
callocは個々の領域のサイズと個数を取るため
とかだろ
それ説明になってないんじゃ……
>>151 学生の宿題であること
出題者が問題歪めてる可能性を考えると
求められている回答はこんな感じじゃないかなってことだよ
今時のcalloc()はmalloc()とmemset()を呼ぶだけだったりするけどね。
質問をした者ですが、大学の宿題と重なったのが不運だったようです。 宿題が終わるであろう1週間後ぐらいにまた同じ質問をしに来ます。
char* str[] = { "aa","bb","cc" }; int i;
>>154 質問しなおしたって回答なんてでないよ。
char* str[] = { "aa", "bb" }; int i; for(i = 0; i < 2; i++) { printf("%s %p",*(str + i),*(str+i));
多分0クリアする時、最適化できるからじゃないかと予想
160 :
デフォルトの名無しさん :2011/05/04(水) 19:17:40.01
インタフェースって何なんですか? コピー機を買いたいんですがパッケージに対応インターフェイスとか 書かれてました。この場合のインターフェースとは何ですか? 後C言語の場合インターフェースとは何でしょう? まじで機械音痴つーか、IT的な想像力がないのかもしれませんが・・
お店で言うと受け付け
雑誌の名前だったような
そんなバンドがいたような
164 :
デフォルトの名無しさん :2011/05/04(水) 19:47:51.73
>>140 「構造体は memset(&hoge, 0, sizeof hoge) が必須」とキリる助教授がいた頃の名残
サイズをバイト数ではなくオブジェクト数で扱いゼロクリアまでできる気の利いた関数がかっこよかったんだよ
166 :
デフォルトの名無しさん :2011/05/04(水) 20:14:36.94
全然重要じゃねえ 保証が欲しいのは値が 0 であることだけで、全ビットが 0 かどうかじゃない もっと言うなら全ゲートが L レベルを出力しているかどうかじゃない 負論理で H であっても値が 0 であることだけが重要なんだ malloc が境界調整要求を満たさないアドレスを返したら規格違反であり そのような処理系でやむを得ず回避策をとることはあっても少なくとも一般論ではない 原発問題にしてもそうだがセンセイの権威の前に目が曇ることには気をつけような
168 :
デフォルトの名無しさん :2011/05/04(水) 20:49:21.07
>>167 大丈夫じゃない頭に大丈夫かと聞いたらどんな答えになると思う? おまえ向いてないよ
heap領域は使いまわしされるので、値が不定 確保だけならmalloc 初期化付き確保ならcalloc というか、関数の動作も調べん輩がプログラムやろうというのが...
>>170 話題になってるのは、calloc()とmalloc()の引数の違いだろ。
はあ?
callocとmallocの動作くらいみんな承知してるのに ドヤ顔で「関数の動作くらい調べろや」って。
>>140 > mallocとcallocは何故引数の数が違うのですか?
どちらもメモリを確保するが、
mallocは引数に必要なサイズを指定して呼び出すのに対し、
callocは引数に要素のサイズとその数を指定している。
それは「どう違うのか」は説明してるけど「なぜ違うのか」は説明してないような
>>170 また話ループしてるって一瞬思ったけどループさえしてなかった。
callocって使った記憶がないな
それぞれの機能を実現するために 必要なパラメータの数が違うからじゃだめなの? 引数の数が同じってのはmallocもサイズと数を受けるってこと??
mallocの下回り書いて、それ使って、callocを実装したことはあるな
callocの引数が気に入らんのなら、オレオレcalloc書いて隠蔽するんだな
質問の意図すら理解出来ていないアホばっかり
エスパーがいるとでも
アホどもは相手しなくて良いから、
質問者の意図を理解できる
>>181 が回答してよ
184 :
デフォルトの名無しさん :2011/05/04(水) 22:29:09.16
182 名前:デフォルトの名無しさん [sage]: 2011/05/04(水) 22:22:36.63
エスパーがいるとでも
ここまで読んだ
183 名前:デフォルトの名無しさん [sage]: 2011/05/04(水) 22:27:34.20
アホどもは相手しなくて良いから、
質問者の意図を理解できる
>>181 が回答してよ
コンパイルとリンクってどう役割が違うのですか? 分ける必要性って何でしょうか? あとどんな言語どんなコードであっても 逆アセンブラで解読されてしまうのでしょうか?
Cのソースをわけておけば変更してない部分をコンパイルしなくてすむだろ LIBとしておけるし つか、広い意味ではアセンブラレベルが読める人ならどの言語も関係ないわな
アセンブラが理解できないと新しい言語作れないのでは? 最低級言語ってのはC言語であろうがjavaであろうが共通ではないのですか?
>>186 馬鹿
相手すんなよ
スレチはさっさと消えろボケ
>>187 別の言語をターゲットにする言語もあるよ
コンパイルすると C のソースコードを出力する様にすれば、
アセンブラの知識は不要になる
知恵袋で質問したらたまに_を全てのスペースに入れる回答者がいるのだが 何故なんだろう。 コピペしてわざわざ消していかないといけない・・・
ニコニコのマイリスト作成スタンプ工作ツール作れる?
/**/は丁寧に入れるのに何故_を入れるんだwwww 全ての行に_があるから消すのに5分もかかったwww
>>185 大きなプログラムを作成するのに、一つのソースファイルだけで記述するのではなく、部分を複数/多数のソースファイルで記述することが多い。
それらのソースファイル群を一つずつ(可能な限り)機械語に変換するのが、コンパイル。コンパイルされた結果はオブジェクトファイル。
オブジェクトファイルを最後に一つに束ねるのがリンカ。
具体的な話については、昔は MS-DOS の事情を詳しく説明した書籍があったが、今はどうだろうか。
置換ぐらい使えよw
htmlだとスペース連続すると縮むに事への対策かね どっちにしろエディタの置換機能ぐらい使えよって話だが
for (i = 0; i < 100; i++) printf(…); 半角スペースでインデントする方法もあることはあって、 2chで広めようとしたけどぜんぜん広まらなかった。 なんかむやみに煽るやつとかいたし。
コピペしたらどうなるか考えてないからだろw
> printf(…); こうならない?
貼り付けると、戻ってしまうのかw & #160;& #160;& #160;& #160; printf(…);
>>205 まあほとんどエディタに貼り付けるから問題ないんじゃない?
>>206 貼り付けた結果がどうなるかはエディタ次第みたい
エディタじゃなくてブラウザ依存だと思うよ
結局全角スペースに置換するのが一番マシ
_邪魔すぎワロタww
どぞー s/\&/\&/g s/ /\ /g s/"/\"/g s/</\</g s/>/\>/g
//〜〜〜〜 と/**/じゃないのも相当めんどい。
置換前提なら_だろうが&#160;だろうがなんでもいい ただ全角スペースだけはダメだ
知恵袋で質問して膨大な量のソースコード返ってくるけどエラー100個以上 出てワロタww何でそんだけでかいコード書いて実行してエラー確認してない のか疑問に思う。
いいから知恵袋に帰れよ
コンパイルできたのに、probably corrupted stackが出た時の絶望感は異常
>>216 それってリンカのオプションで何とかならないか?
>>190 簡単な方法はいくらでもあるが、_をスペースに変換するプログラムを作ってみたらどうだい
>>216 Cygwinだとレジストリを操作するらしい
>>219 どいうこと?
レジストリが操作されちゃうから、そのプログラムはダメって事?
>>218 そんなことできたらノーベル賞取れます。
まぁグリモンあたりで_消滅させればいいんじゃないか
_を入れる正当な理由があるなら俺も怒らない。
>>220 ,221
probably corrupted stack を出すのは gcc 系の開発環境
バグじゃなきゃ、コイツが出やすいのは Cygwin 環境で開発されたもので大体がスタックオーバーフロー
で、Cygwin 環境で開発されたもののスタック領域をデフォルトより大きくするにはレジストリを弄る必要があるという話
こんな説明でいい?
>>216 てか、いまどき Cygwin なんて化石開発環境使うなよ
タダの VC++ Express があるだろう。アレならリンカのオプションで設定できたはず
>>226 malloc使えばprobably corrupted stack出ないですか?
>>226 別にcygwin化石ってこともないだろ。
仮想マシンでLinux入れなよってならわからんでもないけど、VC++すすめるのはなんか変。
>>230 確かに。
どうしてもWindowsでLinuxの真似事したくてcygwinって言うのはアリだよね
タダの開発環境が使いたいと勝手に決めつけて、スマソ
gcc -Wl,--stack=<STACK_SIZE>
233 :
デフォルトの名無しさん :2011/05/05(木) 01:48:13.09
VC++がC99に対応してくれればそれで解決
>>233 あり得ません
Intel C++を買いましょう
C99で何が解決するのかいな?
mallocなんかで領域確保してるのにcorrupted stack出てくる・・・ もう死にたい・・・
ゴールデンウィーク朝7時に起きてずっとやってるのに 70時間corrupted stackと格闘。もう精神崩壊している。
負けるな。頑張れ。
gcc -Wl,--heap=<HEAP_SIZE>
もうやだ。
>>236 どうしても回答して欲しいなら環境とソース晒せや
でなきゃ勝手に死ね
>>213 何で全角スペースがダメなの?
_ よりは置換で誤爆しにくいと思うんだけど
VBでも使ってろ
>>127 それはあくまで表現の仕様であって、
ユニコード使うんだからUTF-8はワイドだろ。
'A' はただの41じゃなくてU+0041なんだし。
>>244 U+0041の段階で既にUTF-8じゃないの。
Unicodeを8bit可変長で扱うためのフォーマットがUTF-8なのであって、 それをワイドと言ってしまうとは…… つーか、内部表現と外部表現をごっちゃにした挙句に文字コードとフォーマットの違いが判っていないとしか。
>>246 解ってないのはおまえだろ。
その扱う対象がワイドだっつってんの。
シフトJISは明らかに1バイトと多バイトが混在してるからな。
だからシフトJISを固定数バイトでエンコードしても、それはマルチなんだよ。
C言語なら俺に聞け(入門編)Part 83
>その扱う対象がワイドだっつってんの。 ……
251 :
デフォルトの名無しさん :2011/05/05(木) 10:37:45.08
C言語でdouble型配列の最大値を返す関数を作ってます。 ifを使って、各要素と比較判定するための変数maxを用意しました for i=0...k if (max <= p[i]) max = p[i]; みたいな感じの操作をするためです。 ここで質問なのですが、 maxを初期化するときに0にしちゃうと要素がすべて負の数だった場合が困ると思ったので 初期化せずにやってみたところ、maxを初期化しろというデバッグエラーがでました。 事後条件がきちんと満たされる為にはどう初期化すればよいでしょうか?
配列の先頭要素で初期化しろ
ループ前に配列の一個目を入れろよ。
うおおおおおおおおおおおお なるほど!!!!! ありがとうございましたああああああああああ!!!!!!
255 :
デフォルトの名無しさん :2011/05/05(木) 10:46:09.29
++iとi++をどう使い分けるのでしょうか?
double getMax(double const * array, int arrayCount) { double maxVal = array[0]; for (int ic = 1; ic < arrayCount; ++ic) { if (maxVal < array[ic]) maxVal = array[ic]; } return maxVal; }
>>255 i++は操作を行ってからiに1を加える
++iはiに1を加えてから操作を行う
>>255 単独で使うのならどちらでも。右辺値として使うのなら意味を考えて使い分け。
>>257 何の操作ですか? まともに説明できないなら回答していただかなくても結構です。
++i++の存在を知っているだろうか
おれも
265 :
デフォルトの名無しさん :2011/05/05(木) 11:08:59.38
仕様さえ知っていれば どう使い分けるかは、もはや宗教でしかない
厳密というか、「操作」ではおかしいだろ。 せめてもう少し言葉を選べよ。
267 :
デフォルトの名無しさん :2011/05/05(木) 11:18:49.41
操作じゃなくて評価
>>269 こんなところで質問してる段階で最底辺なんだよアホ
アホにも分かるように噛み砕いてもらってんだから感謝しろよ
++i/i++ は変数iが参照される前/後でインクリメントされる 以上
>>271 だよなwwwww
何を操作してんだよwwwwwwwwwwwww
操作でも評価でも無く「参照」が正しい 操作を笑うなら「何を評価してるんだよwww」も同様
279 :
デフォルトの名無しさん :2011/05/05(木) 11:46:32.56
>>270 直りました〜〜。
ありがとうございます。
281 :
デフォルトの名無しさん :2011/05/05(木) 12:00:19.58
とりあえずこうやってどうなるか試してみればいいだろ。 printf("1回目 %d %d\", ++i, i++); printf("2回目 %d %d\", ++i, i++); printf("3回目 %d %d\", ++i, i++);
284 :
デフォルトの名無しさん :2011/05/05(木) 12:04:35.04
285 :
デフォルトの名無しさん :2011/05/05(木) 12:08:39.57
参照前にインクリメントってなんだよ インクリメント後に参照だろ
罵るだけで理由は言えないのかね?
おれ
291 :
デフォルトの名無しさん :2011/05/05(木) 12:15:46.01
//Input:
>>282 main(){
int i;
i = 0;
printf("1回目 %d %d\n", ++i, i++);
printf("2回目 %d %d\n", ++i, i++);
printf("3回目 %d %d\n", ++i, i++);
i = 0;
printf("1回目 %d ", ++i); printf("%d\n", i++);
printf("2回目 %d ", ++i); printf("%d\n", i++);
printf("3回目 %d ", ++i); printf("%d\n", i++);
}
/*Output:
1回目 2 0
2回目 4 2
3回目 6 4
1回目 1 1
2回目 3 3
3回目 5 5
*/
293 :
デフォルトの名無しさん :2011/05/05(木) 12:21:26.63
おれ291じゃないからあげるわ
294 :
デフォルトの名無しさん :2011/05/05(木) 12:23:55.55
あげ〜
>>282 こんなメッセージが出ました。
error: " 文字での終端を欠いています
error: " 文字での終端を欠いています
error: " 文字での終端を欠いています
質問スレで下げろてwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
>>282 引数の評価順序って規定されてたっけ?
されてないなら、例としてはひどいな。
黙れハゲ
i++や++iは初心者は使うな、でいいんじゃねえか? これを体感できる環境や状況なんて初心者は遭遇しないし。
>>298 もし「式」の評価で ++i/i++ を説明できるなら
i = ++i + 1;
a[i++] = i;
が未定義なのは何故?
>>300 いや、「実験による学習」の限界を示す例としては
実に適切かと。
そろそろ
>>292 みたいなのが出ると思ったw
↓引数に渡すときの評価順序は〜ウンタラカンタラ
310 :
デフォルトの名無しさん :2011/05/05(木) 13:05:02.52
>>309 int main(){
int i;
int a[3];
i = 0;
i = ++i + 1;
a[i++] = i;
printf("%d",a[2]);
return 0;
}
>>310 int main(){
int i;
int a[3];
i = 0;
i = ++i + 1;
a[i++] = i;
printf("%d",a[2]);
printf("\n%d",i);
return 0;
}
これはひどい
>257 > i++は操作を行ってからiに1を加える > ++iはiに1を加えてから操作を行う { int i,j; i = 0, j = i++; i = 0, j = ++i; } i++は式の評価(jに代入)を行ってからiに1を加える。 ++iはiに1を加えてから式の評価(jに代入)を行う。
i++ 式が値を返したあとに加算 ++i 加算してから値を返す
>315 「式が値を返す」って、どういう事? 値を返すのならば return 文が必要なのでは?
簡単な質問のときだけ盛り上がるな
>>316 GWに独りで2ちゃんで他人にからんで、寂しいヤツだなぁ
>>314 int main(){
int i;
int a[3] = {10, 10, 10};
i = 0;
printf("%d|%d:%d:%d", i, a[0],a[1],a[2]);
i = ++i + 1;
printf("\n%d|%d:%d:%d", i, a[0],a[1],a[2]);
a[i++] = i;
printf("\n%d|%d:%d:%d", i, a[0],a[1],a[2]);
return 0;
}
>314は副作用のわかっている薬草を煮て食べて、副作用を証明しましたとさ
>>320 未定義な式が特定の処理系で実行できたとして、何の意味があるの?
>>327 「関数が値を返す」は分かる。
「式を評価する」も分かる。
でも「式が値を返す」はよく分からない。
>>319 の意味も分かる。
>>324 の意味も分かる。
でも、
>>327 の意味が分からない。
>>328 「未定義な式でも特定の処理系では実行出来る場合がある」
という事が分かるよ。
>>330 i = ++i + 1; と a[i++] = i; は共に未定義
f(i++, i++, i++) void f(int a, int b, int c) { printf("%d %d %d\n", a, b, c); }
すでに宣言していた配列の要素の数を増やすにはどうしたらいいですか?
>>337 普通に数字を書き直すだけで良いと思うが?
別のところで聞きますさようなら
>>329 こんな感じか?
a=b+c;
a=add(b,c);
>>342 何がしたいのか判らないが、
malloc() したものなら
realloc() でサイズを変えて再確保できる。
345 :
デフォルトの名無しさん :2011/05/05(木) 14:29:13.18
ここで聞いていいかわかりませんが解説お願いします 次はC言語で書かれたクイックソートを行う関数である aを配列,L,Rを配列の添字とすると,関数呼出しquicksort(a,L,R)はa[L],a[L+1],…a[R]をソートする quicksort(int a[],int left,int right) { int p,i,pivot,temp; if(left<right){ pivot=a[left]; p=left; for(i=left+1;i<=right;++i){ /*(A)*/if(a[i]<pivot){ ++p; temp=a[p];a[p]=a[i];a[i]=temp; } } a[left]=a[p]; a[p]=pivot; quicksort(a,left,p-1); quicksort(a,p+1,right); } } (1)関数呼び出しquicksort(a,L,R)はa[L],a[L+1],…,a[R]をソートし計算が停止する.このことを説明せよ (2)整数n≧1に対して,quicksort(a,0,n-1)を呼び出してからこの計算が終了するまでのコメント(A)の置かれた行のa[i]<pivotの不等号の比較回数を 再帰呼出しされた呼出しの実行の分まで合わせて,数えることを考える a[0],a[1],…,a[n-1]がそれぞれ互いに異なる1からnまでの整数値をとり,そのとり方は等確率であるとき 比較回数の平均値をf(n)とすると,f(n)<2(n+1)log(n+1)-2nであることを示せ
何の解説だよwww そこに書いてあるそれが解説じゃねーかw
>>322 答えは出てるのにこれ以上何に答えろと?
>>344 reallocを使うのは止めた方がいいかもね。
10年くらい前Solarisでバグったことがある。
352 :
デフォルトの名無しさん :2011/05/05(木) 15:23:24.43
char**t;とはchar型へのポインタ型へのポインタということでしょうか? char*name="YAMADA"として、tがnameのアドレスを指したい場合どうなりますか?
>>350 realloc使わない方がいいのは、
まだそのバグが残っているから?
355 :
デフォルトの名無しさん :2011/05/05(木) 15:37:16.85
>>355 char *name = "YAMADA";
char **t = name;
てことかな。コンパイラがワーニング出すんじゃない?
#define NUM 10 #define SUM(num)(&nor[(num*NUM)]) とはどういうことでしょうか?
359 :
デフォルトの名無しさん :2011/05/05(木) 15:51:09.78
>>358 ああそれね、通約すると「ぼくは馬鹿です」
>>350 kwsk
今でもバンバン使っているのですが、どんなバグだったのですか?
>>361 #define NUM 10
#define SUM(num)(&nor[(num*NUM)])
char *a, *nor;
a = SUM(5);
とあったら、
a = (&nor[(num*10)]);
つまりこの場合だと
a = &nor[5*10];
プログラム実行するたび、a.exeは動作を停止しました。という ダイアログボックスが出てくる・・・何故ですか?cygwinです。
停止したんだろうね。
不思議だ
Cygwinなんてとっとと捨てろよ。 なんでわざわざそんな面倒な環境作ってんだよ。 いまだに初心者にCygwin薦めてる馬鹿は消えてくれよ。 腐った環境をWin世界に持ち込むな。
gcc が cygwin or mingw が無いと動かないと、思ったんだけど。 ./a.exe と a.exe どっちの方法で起動してる?
ぐぐればCygwinがでてくるからしゃーない あと大学とかの研究室では古い環境を使い続けるからな
ここ数ヶ月間ROMってますが、スレの内容があまりにもくだらないんで ログ削除して消えます。サヨウナラ。
行き先をメモして池
373 :
デフォルトの名無しさん :2011/05/05(木) 17:23:25.56
そろそろプログラム終了前であってもfreeしないといけないのか決着をつけてください
MinGWって人気ないのかな? Cを実行したいならコンパクトだしおすすめだと思うけど。 まあ、Unix/Linux入れるのが一番だけどなー。 メモリあるなら仮想でもいいし。
>>373 windowsとかいうOSはメモリ管理がクズなのでどっちでも変わりません
376 :
デフォルトの名無しさん :2011/05/05(木) 17:34:43.46
コマンドプロンプトを横に広げったり色々糞だから cygwin&cygtermをコマンドプロンプト代わりに使ってる
ならpowershell使えよ。
378 :
デフォルトの名無しさん :2011/05/05(木) 17:43:56.56
powershellも横に広がらないよ
どうでもいい
380 :
デフォルトの名無しさん :2011/05/05(木) 18:09:30.45
>>367 プログラミングに
cygwinとか関係あるんですか?
ゲームとか作る時は、結局ツールの環境に依存するからcygwinダウンロードすれば
gcc入ってくるけど、gccだけ使えばcygwin関係なくないですか?
381 :
デフォルトの名無しさん :2011/05/05(木) 18:24:49.92
このスレで死ねとか言ってる人は何なの? 具体的に聞けば、恥ずかしさとひきかえに質問者目線で教えてくれる良いスレ なのに、そういう汚い言葉使っちゃだめ。一部の人だと思うけど。
死ね死ね団
死ねとか言ってる奴は、伸びてるスレに察知して紛れ込んでくる野郎だから気にスンナ。 プログラミングの事とは全く関係ない奴。
384 :
デフォルトの名無しさん :2011/05/05(木) 19:12:03.15
http://www1.axfc.net/uploader/File/so/43815.zip passはmikuc
これの中にあるtokaido_d.cでわからないところがあります。
78行目の
newcell->nextptr->prevptr=newcell;
なんですが、これってnewcell->nextptrのところは領域が確保されてないから、newcell->nextptr->prevptrにはnewcellのアドレス入れられないんじゃないか
と思うんですが、何でできるんでしょうか?
385 :
384 :2011/05/05(木) 19:13:05.55
newcell->nextptr にすでに別のLISTのアドレス代入してあるからだろう ニコ厨死ね
どうしてGCCは関数内で関数を定義できるようにしたの? 他にある?
>>387 C++なら別に普通だけどCでもいけちゃうの?
390 :
デフォルトの名無しさん :2011/05/05(木) 20:37:43.30
>>384-385 n
コメントの説明がビミョウなので、そこをサラッと流しといて
後は、ソースを読むことに集中する。71 : newcell->nextptr = *ptr;
ところで、newcell->prevptr の値はいついれるんだ?
nextptr と prevptr は変数名を入れ替えたほうが良いようだ。(先生口調)
393 :
デフォルトの名無しさん :2011/05/05(木) 20:47:52.45
gotoを使わない方法についての質問 このソースをどう書き換えたらいいですか? int main(){ int array[10][10]; /*配列に対して何かしらの処理*/ /*配列に0が含まれるかチェック*/ int i, j; for (i=0;i<10;i++) for (j=0;j<10;j++) if (array[i][j]==0) goto err; else; /*含まれていない場合の処理*/ printf("0は含ませません"); return 0; /*含まれていた場合の処理*/ err: printf("0が含まれています"); return 0; } これはあくまで例でif文やfor文がいくつもネストしている場合に ネストから抜けるようにしたいです
>>390 クラス宣言してメソッドを書くってのは知ってるけど、
>>387 のはそうじゃないでしょ。
まあ、いつものごとく、隙あらば揚げ足を取りたいひとが
わかってて釣ってるんだろうけど。
>>1 >★C++言語については避けてください。C++対応明記スレへどうぞ
398 :
396 :2011/05/05(木) 20:59:07.83
>>397 borlandで実行すると、書き込みはできるんですが
読み込みをするとバグが起きるんですが・・・・。
399 :
388 :2011/05/05(木) 21:01:39.86
feofの使い方が間違ってる気がする
401 :
400 :2011/05/05(木) 21:02:38.78
動かない件とは関係ないだろうが
>>393 まるっと関数にしちゃえば?そんでreturn使えば?
>>397 だから、あんなに口をすっぱくして言ったのに…変数の初期化を忘れたとは…トホホのホ。
どうでもいい
>>393 書き方が入門者ぽくない
1行だからってちゃんと{}を使いなさい
>>407 は?わかりましたじゃねーんだよ
goto使うなボケ
goto使うの?マジで?
多重ループからの脱出はgoto使うのが1番スマートでしょ
>>412 >printf("0は含ませません\n");
これ何回実行されますか?
多重ループでのエラー処理はgotoで一箇所にまとめた方がいいよ goto何でもかんでもダメダメ教信者は時代遅れ
>>416 コード読めないんだったら、実行すればいいのに
if (array[i][j]==0) goto err; else; /*含まれていない場合の処理*/ printf("0は含ませません");
セミコロンがあるんだw
>>415 >>417 ほとんどの場合がループ抜けたすぐ直下にラベル置くしな
一種の構文みたいなもんだな
On Error GoToは便利
ほっほっ
gotoダメダメ教の人はsetjmpのほうがまだいいの?
局所脱出はgotoみたいなもんでしょ
setjmpが何か理解できてないから文句をつけない gotoは最初に使うなって習うからそこで思考停止してる
オレが働いてるような底辺ITドカタの現場だとgotoは使えない。 レベルの高い人の書いたコードをみるとけっこう使ってる。
書き捨てのコードだったら goto 使う そうじゃなかったら、goto 版と関数を分けて return する版を両方書いてみて良い方を採用
goto 使わないと余計なフラグ設定と判断を入れないとダメなときがある スレチだけど python ってだから嫌い
393みたいのはどうかこうが大差ない 再帰でスタックが心配な時にはgoto無しではどうにもならんし free/close等のfinalize処理が必要な場合には gotoを使うとスコープを汚すことなくシンプルに書ける
無理やり goto 使わずに書くとどうしてもインデンドが深くなる時がある 但し、上の方(後方参照?)に飛んでループを実現するのは勘弁してくれって感じかな
>>393 こうか
int main(){
int a[10][10]= {
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
};
int i, j;
i=0;
j=0;
while (a[i][j]!=0&&i<10) {
j=0;
while (a[i][j]!=0&&j<10) {
j++;
}
i++;
}
printf("%d,%d",i,j);
if (i*j==100) {
printf("含まれません");
} else {
printf("含まれます");
}
}
gotoの利点は今やネットで議論ごっこをやって無限に暇を潰せるという一点だけになってしまったな。
441 :
デフォルトの名無しさん :2011/05/06(金) 00:04:25.89
>>437 のクソコードは条件を満たしてないだろw
printf("含まれます");が実行されるのは特定の箇所が0のときだけ
1000個の異なる数の整数をランダムに出力したいのですが、 b[1000] srand(b[i])だと20種類くらいしか数字出てこないです。他は かぶったりします。 どうしたらいいでしょう?
元のコードが糞だからな
どうでもいい
>>444 srand(b[i])ってなんか変じゃね
それとも「1000個の異なる数の整数をランダム」じゃなくて「1000個の異なる乱数系列」?
>>444 for(i = 0; i < 1000; ) {
b[i] = rand();
for(j = 0; j < i; j++) if(b[i] == b[j]) break;
if(i == j) i++;
}
>>449 1000個の異なる乱数形列です。
まぁ小数なんですけど、整数でもいいです。
123128
423231
232354
534534
・
・
ランダムです。
6桁。
プログラム(JAVA)やってんだけど、 なかなか上手くいかないんだ 頑張って、どのぐらいで習得できる?
どうでもいい
456 :
デフォルトの名無しさん :2011/05/06(金) 00:24:27.77
>>442 おまえがな
一瞬よさげに見えたが対象安価のまとめ方が菅政権なみの無能
どうでもいい
>>437 whileの使い方をまだちゃんと理解してないのかな?
もっとしっかり勉強してからここに書き込みましょうね
>>449 お願いします・・
while文の中でsrand()の()の中に1000種類の違うアドレスを入れれば
いいんですよね?配列だとかぶってしまいます・・・
>>455 今のところJAVAやってる
Cも将来的にする予定
>>393 #include <stdio.h>
#include <stdbool.h>
int main(){
int array[10][10] = {
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
};
int i, j;
bool flag = false;
for (i=0;i<10&&!flag;i++)
for (j=0;j<10;j++)
if (array[i][j]==0) {
flag = true;
break;
}
if (flag) {
printf("0が含まれています");
} else {
printf("0は含まれていません");
}
return 0;
}
>>461 プログラムはまだ作ってません。
とにかく1000個のアドレス・・
どうしたら。
for(i = 0; i < 100; i++) if(((int*)array)[i] == 0) break; if(i == 100) printf("0は含まれていません"); else printf("0が含まれています"); とか for(i = 0; i < 100; i++) if(array[i / 10][i % 10] == 0) break; if(i == 100) printf("0は含まれていません"); else printf("0が含まれています"); とか
>>465 別にアドレスじゃなくても…
for (i = 1; i <= 1000; i++) {
srand(i);
// ここで rand() で好きなだけ数字を生成
}
じゃだめなの?
>>468 それで1000個全部異なっているか確かめよう
c goto しごと
A〜Dは1桁の自然数で ABACA+BAD=BDADA となっているときのA〜Dを求めるという問題をC言語で解きたいんですけど どうしたらいいですか?
>>393 もうこれでいい
#include <stdio.h>
#include <stdbool.h>
int main(){
printf("0は含まれていますん");
return 0;
}
埒があかないので、srand(&i) とにかく1000個のアドレスを取得してwhile1000回ループで 送りたいです。どうしたらいいですか? プログラムは作ってません。 srand(&i)の形式じゃないとだめです。 約束だからです。
>>471 int a,b,c,d;
a=8;
b=9;
c=2
d=0;
printf("A:B:C:D=%d:%d:%d:%d",a,b,c,d);
>>474 もうなんか支離滅裂だな
>>444 に書いてある20種類くらいしか数字出てこなかったコードを貼ってみて。
>>477 めんどくさいっす。もう手痛いんで・・
とにかくmalloc使えば1000個取得できますよね?
教えてください。本当にお手数かけます。
めんどくさいてwwww
>>479 いやぁもう何もかも面倒くさいですよw
1000個違う数字を出すだけ、それだけなんですよ^^
12323
43556
34664
・
・
・
>>478 <(´・ω・`)> 知ってるが
( (
(((( く ̄く ))))
<(´・ω・`)> お前の態度が
) )
(((( > ̄ > ))))
<(´・ω・`)> 気に入らない。
) )
(((( / ̄ > ))))
ヽ(´・ω・`)ノ フゥゥゥゥーーーーー!!!
ノ ノ
((( < ̄< ))))
>>480 はぁ?乱数系列の話じゃないの?
ワシャ、これ最後で寝るから、もう付き合いきれん
>1000個違う数字を出すだけ、それだけなんですよ^^
なら
>>450 のコードでいいやん
標準ライブラリの乱数生成の周期って普通に千以上だろ 普通にrand千回呼べばいい
>>483 >>480 さんは、ひとつの重複も無いことが保証されている1000個の数字が欲しのだそうだよ、どうやら。。。
>>478 こういうこと言いだす質問者を甘やかす奴のせいで
スレがおかしいことになるのわからないのかな
擬似乱数は、非常に大きいけれども、周期 M があって、M 回乱数を生成すると元にもどる。 つまり、 x0 -> x1 -> x2 -> ..... -> x(M - 1) -> x0 -> x1 -> ... となる。そして srand() で変えることができるのは、たかだか x0 のスタート位置であるに過ぎない。 だから、プログラムの中で何回も srand() を呼ぶことは普通はなく、プログラムの最初に一回だけでいいと思う。
>>484 であれば、rand() を呼び出したときに、その答えを記憶しておき、次に rand() を読んだ結果が前と一緒だったら、その結果を
捨てればいい。
goto使わずに多段ネストから一気に抜けたいんでしょ どうしてもって言うんだから、各ネストでフラグの設定・評価しながらbreakで順次抜ければ
人を甘やかす人は何だかんだで良い人が多い。
たんに暇なんじゃね
ここで甘やかせば社会に出ても役立たずのままだしな
for の条件式に書いておけばオケ #include <stdbool.h> ... bool b = false; for(int i = 0; i < n && !b; i++) { for(int j = 0; j < n && !b; j++) { ... flag 使うとぷりぷり怒る人がいるので注意
ここで厳しくしても社会で役に立つ人間になる可能性は限りなくゼロに近いw
495 :
デフォルトの名無しさん :2011/05/06(金) 02:03:01.70
>>492 聞くけど、ここにいる人らって大学や専門学校で出されるプログラムの課題を
簡単にこなせる人多いんですか?
ピンきりだよ
>>498 ありがとうございます!!
でもかぶってる数字ありませんか・・・
500 :
499 :2011/05/06(金) 02:32:43.53
乱数ってrandやsrand使わないと発生できないんですか? 例えば任意の8桁の自然数、例えば23435649として、隣り合う数字を 掛け算して一桁の時にはループ回数の下一桁を加えるみたいな。そう いうアルゴリズムを利用して乱数発生できないですかね?
501 :
499 :2011/05/06(金) 02:35:55.12
訂正 乱数として発生したように見えて、乱数と同じばらつき具合が予想される。
10進数で考えてる所が...
503 :
499 :2011/05/06(金) 02:40:38.40
後もう一個分からない課題。 int型で工夫することによって20桁同士の整数の掛け算を行い char型で計算結果を出力せよ。 全く分かりません。良くこんな課題出すもんだと思います。
>>499 intで宣言した時の最小値と最大値は知ってる?(10進数で)
1から1000までの数を混ぜて並べたのは「乱数」って言わない! 「かき混ぜた数列」とか。
>>503 お前もう向いてないから辞めた方がいいよ。人生を無駄に過ごすことになるよ
508 :
506 :2011/05/06(金) 03:49:16.38
ここの居る奴らに情けをかけても仇で返されそうだけどな
>>508 ?
重複しない乱数ほしいならああ書くのが常套じゃないの?
乱数が何なのかもわかってないアホは相手にすんなよw
>>376-377 コマンドプロンプトやPowershellはあくまでシェルであって
ウィンドウ出してるのはconagentだろ。
だからcygtermとやらでコマンドプロンプトの置き換えはありえない。
どうせbashとか使ってるんだろ。
あるいは、そのcygtermでコマンドプロンプトは動かないのか?
パワシェルの機能は半端ないよな。 bashwww zshwww何ソレwww ってなもんよ。 犬厨にはもう逃げ場が無いわけでwww
tschならまだしもbashとか言ってる時点で・・・w
シェルなんて入力補完できるだけでいいよ csh 以上ならどれでもできるっしょ
cshとかばかじゃねーの
犬厨の「ぐぬぬ」が見れて楽しいwww
GWでもまったくレベルが落ちないのがこのスレのすごいところだね
それどころかいきおい伸びててびびる
>>503 int main () {
int num1[5]={1234,2345,3456,4567,5678};
int num2[5]={6789,7890,8901,9012,123};
int num3[10]={0};
int i,j,k;
for (i=0;i<5;i++)
for (j=0;j<5;j++) {
num3[i+j]+=num1[4-j]*num2[4-i];
if(num3[i+j]>9999) {
k=num3[i+j]/10000;
num3[i+j]-=(k*10000);
num3[i+j+1]+=k;
}
}
printf("\t");
for (i=0;i<5;i++)
printf("%04d",num1[i]);
printf("\n×\t");
for (i=0;i<5;i++)
printf("%04d",num2[i]);
printf("\n=");
printf("%d",num3[9]);
for (i=1;i<10;i++)
printf("%04d",num3[9-i]);
return 0;
}
働けよおっさん
20桁にしているのはint64で扱えなくなるからか
Powerなんちゃらってbashより優れた機能ないよね
528 :
デフォルトの名無しさん :2011/05/06(金) 17:18:50.79
>>393 loopf: for
for
for
〜
break loopf;
Windowsプログラミングってwin32APIを使ったプログラミングのこと? VCとは違うの?
>>523 そういうのってすぐ思いつくの?
それとも定石として知っているの?
>>471 int main () {
int a,b,c,d;
for (a=1;a<10;a++)
for (b=1;b<10;b++)
for (c=0;c<10;c++)
for (d=0;d<10;d++)
if (!(10000*(a-b)+1000*(b-d)+100*b+10*(a+c-d)+d))
printf("A:B:C:D=%d:%d:%d:%d\n",a,b,c,d);
return 0;
}
535 :
デフォルトの名無しさん :2011/05/06(金) 22:42:51.09
で?
っていう
ほっほっ
staticの使い方が良く分かりません・・ static int i=0; としたら i=2;と代入しても0のままなのですか?
初期化と代入がごっちゃになってるね 説明する気はないが
>>538 void func()
{
static int i = 0;
printf("%d\n", i);
i = 2;
printf("%d\n", i);
}
int main(void)
{
func();
func();
}
>538 複文中のstatic宣言なら、自動変数との対比で覚えると良い。 自動変数は、ブロックに入るたびに、メモリ上に確保され、ブロック終了まで参照できる。 静的変数は、プログラム開始時にメモリ上に確保され、プログラム終了まで参照できる。 複文の外のstaticは内部結合を意味して、ファイル外からはアクセスできないようにする。
static int i = 0; i = 1; i = 2; std::cout << i << std::endl; やってみるアルニダ
C++ はスレ違いだ
すれちんこ
main()じゃない関数の外部で定義された関数の中でstatic int i=0; とあればどうなるんですか?
>>546 嫌がらせじゃありません・・・
どういうときに役に立つのでしょう?
const i; struct i; static i; どれが動的でどれが静的なのでしょうか? もちろんmain()が始まってからの話ですが・・
わからないなら無視してていいよ 今後色々なプログラムつくっているうちに こうしたいなとかこうはできないのかなってなったときに その存在と使い方がわかるようになる
553 :
デフォルトの名無しさん :2011/05/07(土) 00:30:28.23
たとえるなら 静的:植物 動的:動物 異論は許さん
main()じゃない関数の外部で定義された関数の中でconst int i=0; とあればどうなるんですか?
>550 struct i;ってコンパイルとおるっけ? 関数の外ならばすべて静的。 ブロックの中ならば、static i;のみ静的。 >555 動的。 const と動的、静的は無関係。
>>555 関数は関数外でしか定義できない。constで修飾された変数は、初期化しかできない。
>>547 こう成増@tokyo
#include <stdio.h>
int sub(){
static int a = 0;
a = a + 1;
printf("sub %d\n", a);
}
int func(){
int a = 0;
a = a + 1;
printf("func %d\n", a);
}
int main(){
sub();
sub();
func();
func();
}/*
sub 1
sub 2
func 1
func 1*/
関数内での static は スコープ以外は外に書いたのと変わらんよ。 変な解釈するやつ多いけどな。 #include <stdio.h> static int a = 0; Int func(){ static int b = 0; a = a + 1; b = b + 1; printf("a:%d b:%d\n", a, b); } int main(){ func(); func(); /*{ a = 0; //可 b = 0; //不可(Error) }*/ return 0; }
560 :
デフォルトの名無しさん :2011/05/07(土) 13:27:49.40
>>556 へー
struct i;
使ったことねえんだ
たぶん関数の中で extern も使ったことないだろうな
561 :
556 :2011/05/07(土) 14:16:32.83
>560 struct i; タグの宣言なのね。 気がつかなかった。 >550の話でなら、struct i;はオブジェクトができないから 動的も静的も関係ないですね。 >たぶん関数の中で extern も使ったことないだろうな 実際無いけど、有用な場面てありますか?
>>560 は?に反応してるだけだから、スルーしてOK
563 :
1/2 :2011/05/07(土) 14:20:37.57
助けて下さい(泣) 初心者です。まず下と次のレスのコードを見て下さい。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char list[][3][80] = { {"abc", "Y", "syuei"}, {"def", "J", "koudan"}, {"ghi", "K", "syougaku"}, {"", "", ""} }; char nyuryoku[100][3][80]; char tyosya[80], syomei[80]; int number, i=0, count=0; again: printf("図書カードカタログ:\n"); printf(" 1.入力\n 2.著者名による検索\n 3.書名による検索\n 4.終了\n\n"); printf("選択項目を入力してください:"); scanf("%d", &number); switch (number){ case 1 : i=0; do{ printf("書名を入力してください(終了する場合は空白のままエンターキーを押してください):"); gets(nyuryoku[i][0]); if(nyuryoku[i][0][0]=='\0') break;
564 :
2/3 :2011/05/07(土) 14:22:52.20
printf("著者を入力してください:");gets(nyuryoku[i][1]); printf("出版社を入力してください:");gets(nyuryoku[i][2]); printf("登録しました。\n"); i++; }while(i<100); if(i==100) printf("これ以上登録できません。\n"); break; case 2 : printf("\n著者名を入力してください:"); gets(tyosya); printf("検索結果・・・\n"); for(i=0, count=0; list[i][0][0]; i++) if(!strcmp(tyosya, list[i][1])) { printf("%s / %s / %s", list[i][0], list[i][1], list[i][2]); count++; } printf("%d件ヒットしました。", count); break; case 3 : printf("\n書名を入力してください:");gets(syomei); printf("検索結果・・・\n"); for(i=0, count=0; list[i][0][0];i++) { if(!strcmp(syomei, list[i][0])) printf("%s / %s / %s", list[i][0], list[i][1], list[i][2]); count++; } printf("%d件ヒットしました。", count); break; case 4:
565 :
3/3 :2011/05/07(土) 14:24:36.14
exit(0); default : printf("無効な数字です。もう一度入力し直してください。\n"); goto again; } rewind(stdin); getchar(); return 0; } 以上のコードなんですけど、switch内のどのgets関数も機能してくれないんです(泣) 何が間違ってるんでしょうか(大泣)
>>563 scanf("%d", &number);
↓
scanf("%d\n", &number);
567 :
デフォルトの名無しさん :2011/05/07(土) 14:34:56.94
>>561 有用性の問題じゃなく (別件としてなら相手してやるかも知れん)
> ブロックの中ならば、static i;のみ静的。
と、あんた言ったろ
568 :
563 :2011/05/07(土) 14:41:36.50
>>566 できませんでした・・・。
ちなみに使ってるIDEはVC++2010Expressです。
>>565 scanf("%d", &number);
で入力したときの残骸を gets() が拾ってしまっている。
でも stdin をフラッシュする標準的な方法は思いつかない。すまない。
あと、
rewind(stdin);
は意図どおりにならないかもしれない。
入力は一元化すべき。 getcharでもgetsでもscanfでも、 どれでも良いけど統一したほうがいい。
while(1){ if(1 != scanf("%d", &i)) return 1; printf("<%d>\n", i); }
scanf使った後に改行がバッファに残るのはクソ仕様だよね
573 :
563 :2011/05/07(土) 15:39:47.67
>>569 scanfについて調べてきました。
なるほど・・・残骸、すなわち入力後の改行がストリームに残されてたままになってしまい、
gets関数が実行された途端その改行が呼び出した文字配列に入力されてしまうため機能しないわけですね。
原因が分かりました!
>>570 肝に銘じておきます・・・
皆さんどうも有難うございました。
C言語でお絵かきソフトって作れますか?
当たり前だろ。
>567 すみません。 指摘したいポイントが分かりません。 > ブロックの中ならば、static i;のみ静的。 とexternがつながりません。 別件として相手していただけませんか?
個別に理解するより auto/static/extern ファイルスコープ ブロックスコープ これらはまとめて暗記しちゃえばおk 何パターンもないんだし
void func(void){ extern int a; static int b=2; auto int c=3; b=add( a, b, c); }
スレッドスコープとかプロセススコープとかはどうなってるんですか
>>579 言語の関知外
OSやコンパイラ方言による
>>579 そんなものはCにはない。
あるいは OS 提供(shared memory(unix), TLS(win32))。
583 :
デフォルトの名無しさん :2011/05/07(土) 22:31:59.36
>>576 main()
{
extern a;
static b;
auto c;
printf("%p\n", &a);
printf("%p\n", &b);
printf("%p\n", &c);
printf("%p\n", malloc(1));
}
int a;
どうだ、つながったか?
今までコーディングして来て extern って一度も使った事無いわあ 無くても何も困らんちゃね・・・ == foo.c == char *baz; void foo() { puts(baz); } == bar.c == void foo(); char *baz = "quux"; int main() { foo(); } == build == % gcc -c foo.c -c bar.c % gcc foo.o bar.o -o foobar == run == % ./foobar quux
>>584 それはリンカが余計なお世話をしただけ
ちゃんとエラーだすコンパイラもある
自作ライブラリ内でグローバルな(でも表には出したくない)構造体変数 …使いそうなシーンが想像できなかった… 第一引数あたりにハンドルとして持ち回す設計しちゃうな
変数はともかく関数には使うやろ
関数だとextern普通つけなくね(デフォルト的な意味で)
明示的にローカルにしたいって事は良くあるが逆はあまりないなぁ
こんばんわ、プログラム初心者です。 int a = (b ? 1 : -1); ↑ こういう『?』とコロンで区切られているのって どういう意味で、どういう使い方をしたら良いものなのでしょうか?
>>590 三項演算子
条件演算子
あたりでぐぐればいいよ
条件 ? 条件が成り立った場合 : 成り立たない場合 int a = (b ? 1 : -1); bが0じゃないの場合 int a = 1; bが0の場合 int a = -1;
int a; if(b) a = 1; else a = -1;
if文で書いたとするとこういうことで良いんですよね? int a,b; if(b != 0) a = 1; if(b == 0) a = -1;
bの宣言がそこに有ることがひっかかるが それ以外はおk
>>595 イイけど、君はなるべく優秀なコンパイラを使ったほうがいいよ
エラーにビビるだけでしょ
599 :
595 :2011/05/08(日) 00:53:29.92
まだスクリプト言語にしか触れたことがなくて これからC,C++に移行する所なのでコンパイラのことなども地道に覚えていこうと思います。 最近Visual Studo C++ 2010 Expressをインストールしましたが、まだ勉強中の身で実際には何も作っていません。 ありがとうございました。お騒がせしました。
600 :
595 :2011/05/08(日) 00:54:20.35
Studio
C,C++よりさきにスクリプト言語…。 いやまてよBASICもスクリプト言語か。
いや、BASICは違うようだ。
603 :
595 :2011/05/08(日) 01:05:16.79
本業がプログラマーではなく CGデザイナー(笑)なので作業のサポート程度に、ということで AutoDeskのMayaというソフトのMELスクリプトというのを習いました。 その後、プラグインとか書きたくなってPythonを少し勉強し、現在C++勉強中です。 C言語と全く関係ない話題でスレ汚しすいません、本当に去ります。
いいからもう黙れ
malloc()で確保された領域のサイズを知るにはどうすればいいでしょうか sizeof演算子ではポインタのサイズが返るだけですよね?
>>605 極度の環境に依存した方法があるかも知れませんが、一般的ではないのでご自分で管理してください。
>>605 標準では存在しません
どこかにサイズを確保しておくか、末尾になんかいれとくかしてください
環境依存で良ければ動的確保した領域のサイズを知る方法も一応有りますが
609 :
デフォルトの名無しさん :2011/05/08(日) 01:49:18.23
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
世界の為に
>>609 ・普通にビット処理に使う
・ビットを使ったフラグ処理で、フラグをクリアするのに使う
・2 で割るより shift を 1 回した方が速い事を利用した高速化に使う
等々、最初の内は気にしなくてオケ
必要になったら思い出せる程度で理解しておけばオケ
それでオケ
>>609 bit単位の演算が必要になるデータ構造がある
bit n〜m番目は、こういう情報が入るみたいな
別のbitにはまた違う情報が入るみたいな
例えばRGBを16bitで表す場合
ttp://msdn.microsoft.com/ja-jp/library/cc371597.aspx 16bitのデータで、赤、緑、青をそれぞれ5bit(もしくは5,6,5bit)で表している。
この16bitの色情報から、赤要素のみ取り出すとか、
逆に赤要素のみ変更するとか計算するときにビットシフトを使う
構造体のビットフィールド使ったほうがいいんじゃね?と思わないこともないが。
他には1bitに一つのフラグを割り当てるとかやるな
>>610 は別にいいだろ。
他はマジレスしちゃったんだなぁと思うが。
荒らしに反応するものも荒らし
そのコピペ2003年くらいからあるのな
新参は死ね
入門スレが新参を拒むとかwww
2*sin((2/3)*π)+2*3.5 みたいな文字列を入力すると計算の出来るライブラリってありませんか?
lexとyaccを使えばわりと簡単に書ける
>>620 lua でもなんでもいいのでスクリプトエンジンをリンクして
文字列のままスクリプトエンジンに渡す
>>620 Maximaとリンクって出来なかったっけ?
shellで式を渡すしかないのか
>>619 え?ここのスレって回答する人も入門者なの?
え?もちろんそうだけど知らなかったの?
自分のこと上級者だとでも思ってたのか?w
レベルを問題にする奴は、五十歩百歩。
629 :
デフォルトの名無しさん :2011/05/08(日) 12:59:57.07
スカラー量にかみ砕いてあげないと解らないイケヌマはどの分野にもいるねw
スカラー量とか覚えたての言葉使いたがる奴もどこの分野にもいるねw
←◎
意味が判ってないまま使うから痛い奴ってなっちゃうよね
633 :
デフォルトの名無しさん :2011/05/08(日) 19:29:57.78
意味を間違えたまま煽る痛杉がいうなw
スカラー量に噛み砕いた説明ってどういうのだろう ちょっとよくわからないから、誰かためしに「スカラー量に噛み砕いた説明」をスカラー量に噛み砕いて説明してくれないかな
来月から基本給がUPする 来月から基本給が10円増える このぐらいの差だが前者のほうが希望がある
実はテンソルの話をしてるんだ だよな
擬ベクトル
そういうのは定量的っていうのだよ
テンソルと3×3マトリックスの違いがわからない
>>639 0次テンソル=スカラー
1次テンソル=ベクトル
2次テンソル=行列
3次テンソル
4次テンソル
641 :
デフォルトの名無しさん :2011/05/08(日) 22:17:43.12
C言語で作れないソフトってありますか?
それを聞いてどうするんですか?
死ね
645 :
デフォルトの名無しさん :2011/05/08(日) 22:22:27.05
関数において再帰構造がある場合ポインタ使ったらおかしくなりますか? 例えば void A(int x, TIME*p) { // // // A(t,p); } という構造だとバグってしまうんですが・・ コンパイルエラーはありません。
>>641 究極的に言えば無いけど、現実的にはある
例えば、ウェブブラウザ上で動くアプリを作るのは、
(NaCl を使うとか、自分でウェブブラウザを自作するとか、
C=>JavaScript なトランスレータを使わなければ)難しい
>>645 ならねーよ
どっか他のとこでミスってんだろ低能
何でこのスレ気が強い人多いの。
ここで暴言はいてる奴って人間なの?
ママのオッパイでもしゃぶってろ
>>645 ならないから
最気のせいせバグったと思い込んでるコードうpよろ
職業プログラマで仕事上でストレス溜まってる奴が暴言はいてるんだろ。
>>645 ポインタ引数の有無でおかしくなる/おかしくならない の挙動は変わらんよ
再帰の終了条件が間違っててスタック食い潰す等の再帰関数に関係する一般的な失敗や、
ポインタの指してる先に実体が無い等のポインタ操作周辺を追ってみたら?
日曜日の深夜までおつとめご苦労様です
>>641 >C言語で作れないソフトってありますか?
C言語「だけ」と言う条件ならある。
char*pのメモリ取得したいんですが calloc使うとどうなりますか?
>>645 基本的に参照してるだけならバグり難いと思うけど、書き換えてたらなんかのロジック勘違いで
バグる可能性はあるような気がす
すいません聞き方間違えました。 結果がどうなる?という意味ではなく 用途はどうなる?という事です。言葉足らずでお手数かけましてマコトに 申し訳ございません。 まずchar*p;として p=calloc(1,4);の場合どうなるのでしょう?というより一般的な用途を 教えてください。
664 :
デフォルトの名無しさん :2011/05/08(日) 23:14:59.77
>>655 イ`ヘ
/: :| ヽ
/ : :/ ヽ ___ _,,,:. .-: :´彡フ
_ノ\_∠: : : : : : : : :`: :-: :,:_:/彡 /
( : : : : : : : : : : : : : : `ゝ /
マ r::/: /: : | : : : : : : : : ::\ /
//: /: : : |: : | |: : |: _: : : :ヽ
ジ {/ 7|`\/i: /|:|/|´: : : : :|ヽ
〉 ,‐-‐、`|7 || |_::|,_|: : :|:::|: |
で / r:oヽ` /.:oヽヽ: :|: | :|
{ {o:::::::} {:::::0 }/: :|N
っ | ヾ:::ソ ヾ:::ソ /|: : |
!? ヽ::::ー-.. /ヽ ..ー-::: ヽ::| r--ッ
-tヽ/´|`::::::::::;/ `、 ::::::::::: /: i } >
::∧: : :|: |J \ / /::i: | /_ゝ
. \ヾ: |::|` - ,, ___`-´_ ,, - ´|: : :|:::|
ヽ: |::|\  ̄/ /| |: : :|: |
>>661 不快な気分になるので止めてください。
>>662 すいません・・
関数を呼び出すたびに(2万回)
char*pに文字列を代入するんですが、この場合同じメモリ場所が
使われているのでしょうか?それならば問題ないと思うのですが・・・
>>665 freeとかその辺ならってないの?
どのみち教本やりなおしてこい
その質問が出てくる時点でおかしい
>>664 「C言語で (もどんな言語でも) 作れないソフト」なら
いくらでもあるでしょ、例えばバグのないプログラムとか...
と言う冗談はさておき、
CPU の特定レジスタ操作しないといけない場合とか、
RAM 使えない状態で動作しないといけないルーチンとかかな。
インラインアセンブラをC言語の範疇に入れればだいぶ
減るけど、それでも RAM なし (=レジスタのみ) となる
と基本的にCだけで書くのは無理だと思うよ。
BIOSでも作るつもりか
>>666 malloc使ったらスタックエラー出ました。
おそらく、その場の評価などのためにしか使わないchar*pを関数が呼び出されるたびに
メモリ取得するからでしょうか?
>>669 自分では正しいと思ってるのにまともに動かないソースを出してもらうしかないと思うよ
本とかの説明見てわかんなかった人だろうからいまさらcallocの説明しても無駄だろうし
>665 >char*pに文字列を代入するんです こうゆう表現をしている時点で、勘違いしているとおもわれ。 >おそらく、その場の評価などのためにしか使わないchar*pを関数が呼び出されるたびに >メモリ取得するからでしょうか? メモリ解放をしていないのかな?
>>674 ありがとうございます。
関数の中でしか使わないので
free(p);としてますよ。
あ・・間違えました。
2万回じゃなくて2億回です。
その関数が2億回呼び出されるたびにmallocするとやはりエラーが出るのでしょうか。
> こうゆう
なんとなく char a[4] で十分なことをやろうとしている とエスパーしてみる
>>668 >BIOSでも作るつもりか
組み込み機器のブート部分とかだから、まあ BIOS みたいなもんだな。
>675 >その関数が2億回呼び出されるたびにmallocするとやはりエラーが出るのでしょうか。 そこは処理系次第。freeしてもOSにメモリを返さない処理系もある。 ただ、そんなに頻繁に呼ばれる関数内でいちいちメモリ確保するのは、 設計の筋が良くないと思うが。
>>679 処理系ってOSのバージョンに依存するんですか?
それともCPUとか?
mallocせんで配列では出来んのかいな?
配列を stack に割り付けるか、静的に作成すれば、malloc する必要は無いよ
配列ってどのくらいの量まで保存できるんですか? a[100000]くらいは? 文字列の場合は?
>>683 配列を heap に確保するのであれば、データモデルとメモリ量に依る
stack に確保するのであれば、スタックサイズに依る
文字列か数値列かどうかは関係無い
例えば LP64 環境で、メモリを 64GB 積んでいるマシンなら、
数 GB の配列を heap にアロケートするのは多分問題無い
LP64ってなんですか?
>>686 LP64 は、
L : Long
P : Pointer
64 : 64bit
つまり、long と pointer が 64bit なプログラム実行環境の事。
Windows さんは LLP64 みたいね。
LLP64ってなんですか?
Long Long Pointer 64
>>688 Large Long Pointer 64
つよいよ
calloc(256,1) と calloc(1,256) で何か変わったりしますか?
>>684 ローマ字名前を配列に1万個保存したい場合はどうしたらいいですか?
ヒープに確保したいです。配列をNAME[]とします。
693 :
XXX :2011/05/09(月) 04:23:44.42
jかd
>>692 char *name[10000];
とchar型へのポインタ配列を10000個作り、strdup()で別の配列に読み込んだ
ローマ字文字のポインタを代入して行けばよい
最後にforループを回してfree()すればなおよい
(ここはあまり突っ込まない。またmalloc&free宗教戦争が勃発するから)
>>691 アロケーションスレッドの振る舞いに違いが出る
詳しくはスクェアメモリあたりを調べてみるといいかも
>>691 内部的には全く変わらない実装が殆どです。意味的に判り易い方を使えばいいでしょう。
man等では第一パラメータが個数、第二パラメータが1個のサイズとなっています。
>>696 何ですか? その「スクェアメモリ」って。"スクェアメモリ"でぐぐると一件も出てこないんですが。
なんだろ。スクウェアメモリとしてもsquare memoryとしてもそれっぽい項目が見つからない。 "アロケーションスレッド"もないなぁ。是非>696には解説してもらいたいが、ここじゃスレ違いだしなぁ。 ここまで見当違いのキーワードを並べるとも思えないから誤爆の可能性もあるけどなぁ。
恥ずかしい勘違いの予感がするなw
別にいいんじゃない。
>>702 いま練習6-4にさしかかってるところだけど
難しくて解答みてまあなんとか理解したって感じだけど
この程度わからないようじゃ問題だとかそんなんある?
え・・・と がんばれ
帳票系でexcel?で出来るようなことを... 思い出すのにはいいかも
解答を完全に無視すればやる意味はあるな
707 :
701 :2011/05/09(月) 20:53:44.33
練習6-4で解答みてじゃないとダメでした 解答なぞるような事しててもやっぱり意味なさげ?
708 :
701 :2011/05/09(月) 20:57:19.87
なんかそれ以降の問題も多分難しげで解答なぞってくような感じ になりそうなんだけど・・
過去プログラマだったんならそれぐらい判断して欲しいもんだけど。 答え見ないとできないんだけどどうすればいい?っていうのは、 仕事のコードかけないんだけどどうすればいい?ってのとほとんど同じじゃないかなー。
そうやって仕事している人たちがいるんですよ
711 :
701 :2011/05/09(月) 21:15:36.01
解答なぞってても意味なさげか まあ過去は自分でわからなかったらネットで調べたり人に聞いたりだったかな
そう思うんならそうなんだろう。
713 :
701 :2011/05/09(月) 21:27:41.74
いや多少は意味もちろんあるだろうけどね 解答なぞるだけでも
ここの人たちは偉そうにしているけど 実際は大したことないから参考になるよ
>>701 練習6-4って、R064ってやつ?
解答見てできたってのが意味不明だけど、あの解答見て疑問に思わなかったのなら
少なくとも私は経験者として採用しないよ。
何が酷いって、趣味なら兎も角プロが保守していくコードとしてみたら最悪な点が幾つも見られる。 >701が再就職のためのリハビリとしてやっているのなら、プロとして出せる品質を満たすために書き換えてみるといいよ。 そうだなぁ、R051辺りを書き直せたら実務経験0のC経験者として採用できる可能性はある。 その位、そのサイトの解答は質が低い。まぁ、趣旨が判らないからサイトそのものの存在意義までは否定しないけどね。
717 :
701 :2011/05/09(月) 22:25:47.14
正直解答みてああこんな流れかくらいにしか見なかったよ
プロとして出せる品質って、このサイトの趣旨とは違うと思う。 初心者に解法の手順や手法を学んでもらう為のサンプルだと思うよ。 理解を妨げるような余分なチェックは省きシンプルに作っていると思った。 リハビリの練習問題としてふさわしいかはよく分からない。 それをしたいと考える人のスキルに依存するかも知れないし。 単純に考えれば、「なぞる」「なれる」「理解する」で良いと思う。
>>701 リハビリが必要なプログラマなんか迷惑以外の何者でも無い
何か自分が提唱出来るC言語におけるパラダイムでも持って居るなら別だが、言語レベルで戸惑うような輩はこの業界に向いてないよ
それは同意する。
現状でダメなのが分かっているから復習してんでしょ
ここまで自演乙
1
>>724 どう見てもスレ違いです。とっととお帰りください。
#include<string.h> int main(void) { char*p; char*s; p = (char *)malloc(20); s = (char *)malloc(20); p="abc"; s="abcd"; strcpy(p,s); printf("%s\n",p); } エラーが出ます・・・・ 何故でしょう? どこも間違ってるように見えません。
p="abc"; で、コードセグメント中の書き込み不可の文字配列を指してるから、 strcpy(p,s); としようとしてもうまくいかない。
どの行でどんなエラーが出ているかを理解しようと努めてからでも質問は遅くない
>p="abc"; pが指している先を"abc"に変えただけであって、 mallocで確保した領域にはコピーされていない
>>726 エラーは出ないと思うけど?
#include <stdio.h>
#include <stdlib.h>
〜〜〜〜
return 0;
// p="abc"; s="abcd"; strcpy(p,s);
>>730 出ます。
#include<string.h>
int main(void)
{
char*p;
char*s;
p="abc";
s="abcd";
strcpy(p,s);
printf("%s\n",p);
}
malloc抜きました。これでもCorrupt stackエラーがでます。
p = (char *)malloc(20); で20バイトの領域を確保してその先頭アドレスをpに格納している p="abc"; でコンパイル時に領域確保された"abc"の先頭アドレスをpに格納している この時点で先ほどmallocで確保した領域はメモリリーク strcpy(p,s); pの先はは書き換え付加領域なのでエラー
char *p = malloc(20); strcpy( p, "abcd" ); printf( "%s\n", p );
>>732 "abc" とかの文字列定数は上書きしちゃいけないぜ
なにせ定数だからな
strcpy("abc", "abcd"); って書いてみればアホなことやってるのがわかるだろ
ではどうしたらいいでしょう・・・ char*p,char*sの設定は決まりとします。
>>738 コピー先に、コピーできるだけの十分な空きを確保してから実行。
元のプログラムに沿った形でやるなら p = (char *)malloc(20); s = (char *)malloc(20); strcpy(p, "abc"); strcpy(s, "abcd"); strcpy(p, s); こうじゃね
mallocをキャストする必要はないよね
char* new_str(char* a) { char* b = malloc(20); strcpy(b, a); return b; } こんなのつくって p = new_str("abc"); s = new_str("abcd"); strcpy(p,s); こうすれば
>>740 そこはstrncpy()に直しとけよw
なんで?
>>744 p = new_str("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
>>745 元が考慮してないんだから、それが起こることはないという絶対の自信があるんだろうと思うよ
748 :
701 :2011/05/10(火) 19:58:33.15
>>732 char*p = "abc";
char*s = "abcd";
名前がのこったままだった><
750 :
デフォルトの名無しさん :2011/05/10(火) 20:01:11.50
char*s=abcd; char*p=abc; char*ss; char*pp; "abcd","abc"、s,pを用いずss,ppを使うことによってstrcpyを使う場合は どうなりますか? その結果printf("%s\n",s)が abcと出力される。
>>746 なんか嫌なコードだな
mallocにキャスト必要無いしcharは1バイトが保証されてる
>>751 malloc のキャストはともかく,
sizeof(char) については他の型の場合とで見た目を変えたくないので
>>732 は
ポインタの複写と
ポインタで指した先の内容の複写
文字列って何? が整理ついていないような気配
>>753 そうかもしれません。
char*p;
としたらとりあえずchar型へのポインタでよね。
この場合メモリーが取得されてるからp=malloc・・・とするのは
間違いじゃないんdねすか?
755 :
デフォルトの名無しさん :2011/05/10(火) 20:30:53.75
独習Cという本を終わらせたとこなんですけど、 他に基礎固めとして読んどくべき本があれば教えてほしいです。 これぞ隠れた名著!みたいな本もあればぜひとも教えてほしいです。
>>754 > そうかもしれません。
かもしれない、じゃなくてねw
自分が理解できてないことすら理解できないのなら道は遠いぞw
自分でちゃんと勉強した?w
>>754 > char*p;
> としたらとりあえずchar型へのポインタでよね。
ここまでは正解。
>この場合メモリーが取得されてるから
いいえ。
あそうか。 char*pの場合はポインタだから、mallocしたら、ポインタp先の領域が確保 されてるってことなんですね。ポインタ自体の領域は別にあるんですね。 int pをmallocする場合はp自体の場所が領域としてあらたに保持される。 この理解でよろしいいでしょうか?
> あそうか。 違います。
> int pをmallocする場合 どうやるの?
>>758 すいません、どこが違うのでしょう・・?
けんか腰ではありません!
質問する前にちゃんとした本を一冊読んだほうがいいと思う
char*p="ABC"としたとき ----- ------------- | | | | | | | p |---------→| A | B | C | ----- ------------- 100番地 n番地 m番地 z番地 ってことですよね? 間違いですか?
>>761 ポインタはメモリの住所を格納する変数。
malloc()はメモリ一部分を確保して、そこの住所を返す。
ポインタは初期化していないと、無意味な住所が入ってる。
あとはわかるな?
>>763 "ABC"って何をしてるんですか?
char*p="ABC" + "DEF"の場合どうなるんですか?
初期化っ何をするんですか?
>>764 分かります。メモリの情報が入った変数ですよねw
あぁ情報って言ったらごかいされそうだなwどこにあるかという
情報。
char*p=(char*)malloc(10)
としたら。10個のcharを格納できるメモリを取得してその先頭アドレスを
pに保存するって意味ですよね。
>>769 すまん
> そして,"ABC" + "DEF" はアドレス同士の足し算になる
は間違い
>>768 のコンパイルエラーが正しい
>>767 OK
あともう一つ。
それはpにメモリが確保された訳じゃない。
確保されたのは、あくまでもpが指してるメモリ。
"ABC""DEF"でおk
俺に聞けって誰のことですか?
>>767 char*p=(char*)malloc(10)
は10バイトを割り当て、割り当てられたメモリに対するポインタで、char *として宣言された変数pを初期化している。
>>770 コンパイルエラーになるのはなんでですか?
多分アナタがやりたことは char*p="ABC""DEF"; とすればエラーにはならん
>775 +の被演算子が両方共ポインタという演算は定義されていないから。 ポインタと整数はOK ポインタとポインタの差をとるのもOK.
>765 文字列リテラルの型はconst char [N]。 したがって通常の配列と同様に、式中ではその先頭要素を指すポインタとなる。 (例外は&, sizeofの被演算子になった場合と配列の初期化子になった場合) char*p="ABC"; とした場合、"ABC"の先頭要素であるAを指すポインタでpを初期化する。
な、長い釣りだな・・・。
質問者は名前に726っていれてくれないかな ごちゃごちゃしてよくわからん
781 :
726 :2011/05/10(火) 22:40:50.16
>>777 初心者の場合なぜコンパイルエラーになるかが大事ですよね
ちょっ考えればポインタ同士の演算で+*/は意味が無いってわかりますよね
位置同士の演算で-なら距離とかを期待できるけど
+*/した結果に何を期待するかとなると意味無いんじゃないに成りますよね
まず、初期化と代入の違いを把握せよ。 次に、文字列をどうにかする「演算子」は、Cには存在しない(全て関数である)ことを認識せよ。
Cには文字列型がないことを認識せよ、のほうが先じゃないかな
でも文字列定数はある
C言語は21世紀のアセンブラと認識せよ これでソフト作る奴はきちがいになれ
Linusのようになりたい
君の毛布は何かな?
お前は今までに被った毛布の数を覚えているか?
Linus なら毛布は大切にしているはず
目先の金のためにプログラミングしてんじゃ無いもんな それなのに金は付いてくる、そこがすげぇよ
ヘルスバーグ先生に憧れる
これは、配列の全要素が、全ビット0でなくヌルポインターで初期化されると考えていいのでしょうか? char *p[10] = { 0 };
mallocをキャストする馬鹿はソースコードの拡張子がcppになってる説
K&R時代を考慮してるとか
必要なくても、しちゃいけないわけじゃないんだから、他人がしててもどうでもいいだろ
さらに変なのが来たw
>>795 あんたが C 専門で,C++ に触れるつもりもないって言うんだったら
キャストしなくていいと思うよ
別に仕様で禁止されてるわけじゃないんだし,文句言われる筋合いはない
C++でmalloc使う奴も同罪だろw
つまり要約すると、 OSを買う金すらなくて、C++をベターCとしてしか使えない奴が犯人ってことか。 さすがにいねーだろそんな奴w
C++だったらmalloc()なんて使わないか、使うにしてもちゃんとしたキャストを使う。 従って、Cスタイルキャストなんてするのが馬鹿。
static_castにするかreinterpret_castにするかで迷うんですね
>>803 ベターCだったら、mallocは基本関数だろう。
C++でCスタイルキャストを使うと、ウォーニングエラーになる?(o/x)
806 :
デフォルトの名無しさん :2011/05/11(水) 16:49:28.61
ビール(350ml、アルコール含有量5.5%)x本と焼酎(アルコール含有量25%) をy(ml)飲みました。摂取したアルコールの量zを求め表示するプログラムを作りなさい /* 演習問題2−9 */ #include <stdio.h> main() { float x, y, z; printf ("ビール(本) => "); scanf("%f",&x); printf ("焼 酎(ml) => "); scanf("%f",&y); z = x * 350 * 0.055 + y * 0.2; printf ("アルコールの摂取量は %6.1f\n",z); return (0); } 意味が分からないので教えて下さい
>>806 どこが判らないのか具体的に。
難しいことなど何にもないのだから、全部が全部判らないというのなら教本を始めから遣り直しましょう。
問題の意味がわからないとかじゃね たぶん算数の文章問題が苦手な人なんだよきっと
>>808 0.2になるあたりは俺も意味がわからないよ
>>810 大丈夫、それは私にも判らない。駄菓子菓子、>806がそこが判らないのかどうかは分からない。
>>808 z = x * 350 * 0.055 + y * 0.2;
この計算の部分です
>>812 z = x * 350 * 0.055 + y * 0.25;
アルコール摂取量[ml] = 飲んだビール[缶] * 350[ml/缶] * 5.5[%] + 飲んだ焼酎[ml] * 25[%] 単位に注目すると、[ml] = [缶] * [ml/缶] * [%] + [ml] * [%]。 [缶] * [ml/缶]は[ml]になる。つまり、飲んだビールの量を缶単位ではなくml単位に単位換算している。 25[%]を何故0.2にするのかは恐らく書いた本人以外は分からないと思う。
ありがとうございました 所々知識の危うい所はありますが、試験は全部持ち込み可なので十分です
#include <stdio.h> #include<string.h> #define A 100 int na(char str[]); int main(void) { char a[A]; scanf("%s",a); na(a); return 0; } int na(char str[]) { printf("文字の長さは%d desu\n",strlen[str]); } 何で動かないのこれ?
ビールと焼酎でアルコール○○度(○○%) が 体積比率 重量比率 で分かれてるのか? とぐぐってみたが同じだった
>strlen[str]
>>817 21行目、関数の使い方が間違っている。
23行目、戻り値がない。
だからエラーになっている。今度から、「動かない」ではなく「これこれのエラーが出た」まで書くようにしよう。
うごかなくはないだろ。
動かない理由はstrlen[str]だけ 値を返してないのは警告どまり
[]じゃなくて()でした かんちがいした やっぱむずいわ 今度から「動かない」ではなく「これこれのエラーが出た」まで書きます ありがとうございました
それを難しいじゃなく、恥ずかしいと思える日がすぐ来るよ
そんなエラーは何行目がおかしいとかって出るだろうから すぐ気づきもしようもんだが・・
ごめん…… まさか君が惨めで暗くて寂しいC89を使ってるとは思わなかったから…
動くって言い張ってる奴はコンパイラが動くといっているのか? コンパイルエラーが出るという話をしているんだが理解できているか?
エラーと警告の区別がつかない人がいます
int hika(char str[],char str2[]) { if(str==str2) { return 0; } else { return 1; } } 関数を作りましたstrcmpをつかえば出来るんだけど、あえて使わない方向で。 strとstr2が同じとき0を返したいのに、同じときも違うときも1を返します
if(!(str==str2))にしたらできた? なんだろこれ 意味不 なんで if(str==str2) じゃだめなんだろ
int型なのにreturnしない関数を書いてみたらgcc4.3.4だと警告すら出なかった まあ-Wallつけたらさすがに警告は出る
できてねえwこんどはりょうほう0かえしやがったwww
>>834 ちゃんとループして文字を比較してください
>>834 strとstr2は文字列ではありませんcharのポインタです
ポインタを比較しても中身が同じかどうかなんて分かりません
Cに文字列型は存在しないのでおとなしくstrcmpで比較しましょう
>>834 配列は、一部の例外を除いてポインタに型変換される。
一部の例外とは、sizeof演算子,単項の&演算子での演算、
またはchar型配列の初期化時に文字列リテラルを代入する場合。
つまりstrとstr2は、==演算子で演算されるときに、
配列の先頭を示すcharのポインタとして比較される。
入門者相手の解説なら、
>>839 の方が単純で分かりやすいんだろうが、
厳密に言うと違う
あのう str1 も str2 も(関数引数由来の)ポインタなんですが…
>843 傷口に塩を塗り込むようで申し訳ないが、、。 前半の文章は、私が別件でレスした内容と全く同じ。 なんだか私が間違ったことを書いているみたいで、恥ずいじゃないか。
848 :
デフォルトの名無しさん :2011/05/11(水) 23:20:27.05
ポインタについて質問です。 char*pにおいて、pが100番地(番地の数字は適当)を指していたとします。 でchar*tと新たにポインタを設定して、t=pとしますよね? するとtも100番地を指しますよね? そして、この後pが別の番地200を指した場合、tも200番地を指すのでしょうか?
850 :
デフォルトの名無しさん :2011/05/11(水) 23:36:41.56
>>849 int main(void)
{
char*p;char*s; char*r;
p="yamada";s=p;
printf("%p\n",s);
printf("%p\n",p);
p="tanaka";
printf("%s\n",p);printf("%s\n",s);printf("%p\n",s);printf("%p\n",p);
}
すいません、確かに変わるわけないですよね。
char*型を返す関数を char_reply()として printf("%p\n",char_reply());はエラーを起こさないのですが printf("%p\n,&char_reply());がエラーを起こしてしまいます。 もちろん()の中は引数入ってますよ。省略してますが。 char*tの場合 printf("%s\n",t)も printf("%s\n",&t)もエラー起こしません。 どういうことなのでしょうか?
>>851 奥深いなw
言語仕様上はよく分かんけど、関数の戻り値は一般的にレジスタでアドレスがないから
なんか、自分で言ってて嘘くさい…
mallocの戻り値をキャストする男の人って
>>851 例が構文エラーなのはおいといて、右辺値なので&演算子は使えない。
てか、そういうエラーでてない?
アドレスが無い所に & を付けたらエラーになって当たり前じゃないの? lvalue じゃないからダメよってエラーが出るでしょ
>>851 &char_reply()
こんな文法はCに存在しないから
でも ptr=char_reply; printf("%p\n",&ptr);ならちゃんと ポインタ変数のアドレスが出てくるんですよ。
>>859 それ関数のアドレスだよ
関数はメモリ上に機械語の命令が展開されるからアドレスが振られていて当たり前だし、
関数にアドレスが無かったら関数ポインタを使ったテクニックも使えなくなっちゃうでしょ
>>859 それはptrのアドレスやからや。
char *pのとき&pの型はchar **になる。分かってる?
関数が返したものはアドレスがあるなら何故エラーになる。
>>861 分かります。
char*str
char**qtr=&str
printf("%p\n,qtr)とprintf("%p\n",&str)は同じ値。
>>863 (関数が返したアドレスの)アドレスが無いからエラーになる
>>864 ホントかよw
>>851 > char*tの場合
> printf("%s\n",t)も
> printf("%s\n",&t)もエラー起こしません。
意図不明なこれ見て言ったんだが。
834だけど こころがおれたw とりあえずstrcmpでいいや こんなんでだいじょうぶかな まあstrcmpでできることはstrcmpでやればいいんだけどさ
>>865 一応情報何だから動的にメモリを移動することはありますよね?
>>868 厳密な事は言えないけど、プログラムからアクセスしていいエリアには移動されないと思うわ
printfってプリントエフって読むんですか? プリントフは何か聞こえがださいですよね。
例えば構造体の実体を返す関数だと &char_reply() はどうなるの?
int *p, a=1, b=2; p = &(a+b); こんなことできないだろ。 それと同じだよ。
strcpyの読み方で 一番カッコいいのは ストラシーパイ
時代を感じるよな。 フツーにエディターが使える今ならこんな省略なんてありえないだろ。
scanfってなんであんな仕様なんですか?
ユニークな名前の方が検索し易い
エディタというか、通信環境の関係だな。 Unixのコマンドやディレクトリ名なんかも省略しまくりだしな。 usr とか、こんな1文字ばか減らしてどうなんだよ? ってのもあるしな。
for(;;)とwhile(1)で実行速度に差って出ますか?
規格上で最低でも、内部識別子は先頭から 31 文字が有効で外部識別子は先頭から 6 文字が有効という時代があった
scanfってなんであんな仕様なんですか?
>>880 % cat foo.c
int main() {
int i = 0;
for(;;) { i++; if(i>1000000000) break;};
}
% cat bar.c
int main() {
int i = 0;
while(1) { i++; if(i>1000000000) break;};
}
% gcc -S foo.c
% gcc -S bar.c
% diff foo.s bar.s
%
% gcc foo.c -o foo
% gcc bar.c -o bar
% sum foo
56129 9 foo
% sum bar
56129 9 bar
マクロってexeのことじゃないの? そんな話をしたら白い目で見られた、今日この頃・・・
>>877 O_CREATのことは許してやってくれ。。。
このスレのどこが入門編だよ 失せろ上級者!
C言語の参考書で迷っているのですが かんたんC言語 と やさしいC言語 はどうなのでしょうか?
スレチだ消えろ死ね
ARMの32ビット境界とかウザくて仕方ないんだが。 つーか、だったら 1バイト = 32ビット ってすれば良いじゃん。 わざわざ4アドレス持たせる意味あんのか? 設計した奴アホなんじゃね?
苦しんで覚えるC言語がよかったよ
>>891 それだと char* が使えなくなるじゃないか
それとも文字列 1 文字あたり 32 ビット使うのか?
まぁ Unicode でそうするのもありかもしれんな
>>889 どっちかっていう判断がそもそも間違い。
どっちも読め。
ネットの入門サイトなんかも含めて読みまくるべき。
入門書ならどれもK&Rを噛み砕いて説明してるような感じだから1冊あれば十分だと思うけど Web上のサイトでは猫Cはおすすめできない Windows APIが絡むとCが極端に退屈でつまらないものになる。
ガウス―ジョルダン法の掃き出し法により、次の連立方程式を解くプログラムを作成 しなさい。 #include <stdio.h> void main(void) { int i, j, n, n1, k; double a[10][11], w; printf ("未知数の数=> "); scanf ("%d", &n); n1 = n + 1; /* 方程式の係数の入力 */ for (i=1; i<=n; i++) { for (j=1; j<=n1; j++) { printf ("方程式の係数 a[%d][%d]=> ",i, j); scanf ("%lf", &a[i][j]); } } /* 方程式の係数の表示 */ printf ("\n方程式の係数 a[%d][%d]\n",n, n1); for (i=1; i<=n; i++) { for (j=1; j<=n1; j++) { printf ("%8.2lf", a[i][j]); } printf ("\n"); }
/* 掃き出し計算 */ for (k=1; k<=n; k++) { w = a[k][k]; for (j=k; j<=n1; j++) { a[k][j] = a[k][j]/w; } for (i=1; i<=n; i++) { if (k != i) { w = a[i][k]; for (j=k; j<=n1; j++) { a[i][j] = a[i][j]-w*a[k][j]; } } } } /* 計算結果の表示 */ printf ("\n計算結果の表示\n"); for (i=1; i<=n; i++) { printf("x[%d] = %8.3lf\n",i, a[i][n1]); } } これ、数学2Bしか履修してないしそもそもfor文の入れ子とか難し過ぎるんですけど 説明できる方いますか? 問題文を間違えたのでもう一度 21.ガウスージョルダンの掃き出し法により、次の連立方程式を解くプログラム を作成しなさい。
2x[1] + 3x[2] + 4x[3] = 6; ・・・1 3x[1] + 5x[2] + 2x[3] = 5;・・・2 4x[1] + 3x[2] + 30x[3] = 32; ・・・・3
まず、言語が解らないのか数学が解らないのかをはっきりしろ。 数学が解らないなら数学板に行ってこい。
中学生レベルの数学知識があれば理解できるはずなんだが
中学生にそれ言ってどうするんだよ?
名前が難しいことやってる風にハッタリかましてるだけで、 実際は中1で習う程度のことだったりする
連立方程式でさえ中2にならんと習わんのだぞ……
中学の数学なんてもう忘れたよ 20年も前のこといつまでも覚えてるわけない
数学2Bっていうのは中学校で受ける教科なの?
アルゴリズム辞典とかに答え出てるだろうに 間違いを見つけて欲しいのかいな?
>>906 なんか面白い言い回しだな。
意地悪で揚げ足取るわけじゃないけど、直近20年のことしか覚えられない人みたいで
なんだこいつ
なんだそいつ
なんだあいつ
どいつだよw
オラんだー
エイホ光臨してんの?
係数で割って引き算するだけなのに、何が分からないんだろう 計算自体は小学生レベルの算数だっていうのに
プログラミングの話だろ 何言ってんだ
920 :
デフォルトの名無しさん :2011/05/12(木) 20:13:01.68
大きい桁の計算と表示ってどうしたらいいですか?
>>920 はやく128ビットOSが出るように願う
924 :
デフォルトの名無しさん :2011/05/12(木) 20:24:05.45
>>920 例えばlong long(C99から対応)などの大きい型を使う
それでも足りないほどの巨大な数を扱うのであれば
多倍長整数演算を実装する必要がある
過去レスに20桁の掛け算なかったか? あれ見ろ
64bitより大きい四則演算ならnetで調べながらやれば作れるよ
キャリーフラグって便利だよな。
GNUのBignumライブラリ使えばいいでしょ
つーか、別に難しくないだろ。 単純に上位の桁と下位の桁に分けて計算すればいいだけじゃん。 もっと桁を増やしたいなら四つでも八つでも分けたらいいし。 どうすれば、って訊くほどのものか?
perlで文字列計算やってみたことある。 200文字同士の掛け算がアホのように遅かった。 その後にBigIntを知ってそのアホなスクリプトは封印した。
CでGUIアプリ作りたいんですけどGUIフレームワークってWin32API以外にありますか?
>>935 Clutter
Gtk+
Tk
SDL
GLUT
>>930 多倍長整数同士の除算を行う単純な方法を教えてくれ
>>937 倍倍にしながら数値を比較して減算していく
>867 strcmpのソースをみりゃいいんだけどね。 やりたかったのはこんな感じでしょ。NULLを渡された場合は考えてないからそのツモリで int hika(char str[],char str2[]) { int i; /* str終端まで比較 */ for (i = 0; str[i] != '\0'; i++) { if (str[i] != str2[i]) { /* 不一致ならループ抜ける。 */ break; } } if ((str[i] - str2[i]) == 0) { return 0; /* 一致 */ } else { return 1; /* 不一致 */ } }
strcmpくらいで心が折れるんなら止めた方がいいよね。
>>940 ふーん。
hika("hogehoge", "hoge");
読めよ
もうひとつ似た質問を。 CでGUIアプリを作るときに使うのは一般的にWIN32APIですか? ていうかCはGUIアプリ作成に向いていますか?
int hika( const char const *str1, const char const *str2 ) { while( *str1++ && *str2++ ) { if( *str1 != *str2 ) { return 1; } } return 0; }
>>946 なんでだよ
5個のりんごを2人で分けましょう
2人が1個ずつとると、3個のこりました
さらに1個ずつとると、1個のこりました
さらに1個ずつとろうとすると、足りないことに気がついたので、
けんかにならないように、お皿へもどしました。
2人は2個ずつのりんごをもち、残ったのはひとつです。
>>945 >CはGUIアプリ作成に向いていますか
ぶっちゃけ向いてないと思うよ。
GUI アプリの作成は、オブジェクト指向言語が最高にマッチしている最も代表的な分野で、
オブジェクト指向を備えていない言語で GUI のプログラミングをするのはかなり大変。
勿論 C で GUI アプリを作る事は不可能じゃないけど、プログラムの記述量は多くなるし、
奇麗に見通しよく書こうとすると並大抵の労力では不可能だと思う。
C で作られている GUI アプリって、めぼしい物では Gimp くらいじゃないかな。
素直にstrcmp使っとけってことだな
>>947 const char const *
?
const char * const だな
strcmpクソはえぇぇwww
なんだろな。 一文字ずつ比較するのではなく、ループ内で何文字かまとめて比較してんのかな
>>957 最初の数文字は必要ならアドレスアライメント調整を兼ねて一文字づつ比較、
その後は int とかで何文字かまとめて比較
で、最後にまとめられない残りがあれば一文字づつ比較
というのが GNU glibc での実装。多分、他の標準Cライブラリも似たようなことはしてるはず。
961 :
960 :2011/05/12(木) 23:15:11.04
だけでもつまらないので、特に混乱をきたさない範囲で。 int hika(const char *str1_p, const char *str2_p) { register const unsigned char *str1 = (const unsigned char *)str1_p; register const unsigned char *str2 = (const unsigned char *)str2_p; while(*str1 == *str2 && *str1) { str1++; str2++; } return !(*str1 == *str2); }
>>949 ありがとうございます
やっぱりGUIやるならJavaとかC++ですよね・・・
うーん、せっかくC勉強したのに使い道がないなぁ。。
win32apiをラッピングして独自GUIフレームワークを作るのがCプログラマの生き方
おかげさまで気兼ねなく使えて喜ばしいことだよね
>>962 うんにゃ、全く無駄ということは無い。toolkit に GTK+ を使いなさい。GTK+ 自体は C で書かれているし。
GNUでC++のものってあるの?
>>967 GTK+プログラミングの情報が少ないのに
>>962 >やっぱりGUIやるならJavaとかC++ですよね・・・
Java(on Android) は良いとして、今 C++ をやるのはどうかな。。。
お使いのプラットフォームに依って ObjC や C# や Vala を使うのが良いと思う。
>>968 昨年 gcc が C++ 利用を承認したらしい、機能限定みたいだけど
C が OS を記述する言語としてユニークな位置を占めている様に、 C++ はコンパイラとランタイムを実装する事に特化した言語に なりつつあるな。
>>967 gtk+ちょっと調べてみます
>>969 なんかみんなCとDXライブラリでゲーム作ってますよね
>>971 C#はちょっと興味あるからやってみようかな
C++の規格って今どうなってるんだろ。手を出そうとは思わないけど
VCの、64版でもintが32bitって仕様はどうなのよ? ぶっちゃけ失敗だろ。 なんでこんな。
>>976 32bit で済む計算が殆どだからじゃないの。
配列のインデックスとかループの回数とかイチイチ 64bit になってたら勿体ないっしょ。
次スレそろそろよろ
拒否された
いってくる
>>948 筆算を難しいと言う奴はほとんどいないが、
筆算の人間的推測をプログラムで実装するのは意外に難しい
ってかTAOCP vol2のアルゴリズムDみたいな例を参照してもややこしい
sizeofがあるのにどうしてstrlenが必要なんですか?
スレ立て規制されてたorz 他の方お願いします
>>983 #include <string.h>
#include <stdio.h>
int main()
{
char str[10] = "hoge";
printf( "sizeof .. %d\n", sizeof(str) );
printf( "strlen .. %d\n", strlen(str) );
}
986 :
屑 :2011/05/13(金) 00:31:59.24
スレも建てられないクズばかりなのかよ
987 :
デフォルトの名無しさん :2011/05/13(金) 00:32:28.65
int array1[] = {1, 1, 1} int array2[5] = {1, 1, 1} array1のところで要素数を省略できるのは処理系依存ですか? array2のところでarray2[4]=array2[5]=0となるのは処理系依存ですか?
処理系ってなんですか? OSのことかな
>987 Cの規格でその書き方が認められている。 1番目:配列の宣言で要素数を省略した場合、初期化子の要素数分のメモリが確保される。 2番目:初期化子で与えた要素数以上は0で初期化される。確保した要素数以上に初期化すると、動作は未定義。
親切なコンパイラだとちゃんと警告だしてくれるよ
>>978 > 配列のインデックスとかループの回数とかイチイチ 64bit になってたら勿体ないっしょ。
ループカウンタなんて大抵レジスタだし、メモリにとっても高が4バイト増えるだけだろ。
勿体ないって、今時どんだけ節約志向なんだよ。(w
面倒くさいから、他の例は自分で考えといて
共用体の出番か
たてるー
おつ〜
>>997 糞スレ立てた理由を1000字で表現せよ
enumの必要性ってなんですか? 便利なだけ?
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。