C言語なら俺に聞け(入門編)Part 74
■ このスレッドは過去ログ倉庫に格納されています
★前スレ
C言語なら俺に聞け(入門編)Part 73
http://hibari.2ch.net/test/read.cgi/tech/1289049065/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 143代目
http://hibari.2ch.net/test/read.cgi/tech/1289913298/
★C++言語については避けてください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
# サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0232デフォルトの名無しさん
2010/12/05(日) 00:46:03これ以上引き延ばすんじゃない
0233207 ◆SGcgbjkFYo
2010/12/05(日) 00:49:47ありがとうございました。
0234デフォルトの名無しさん
2010/12/05(日) 00:52:330235デフォルトの名無しさん
2010/12/05(日) 01:25:10嫌味じゃないがまぁもうちょっと勉強した方が良いな。
あんまり変な質問したらこのスレだと結構叩かれるからなw
0236デフォルトの名無しさん
2010/12/05(日) 01:29:340237デフォルトの名無しさん
2010/12/05(日) 01:37:060238207 ◆SGcgbjkFYo
2010/12/05(日) 01:47:147行目の
FRUIT moon(FRUIT object1, FRUIT object2)
は
FRUIT moon(FRUIT object1, object2)
じゃだめなんでしょうか?そうならば何故ダメなのでしょう?
0239207 ◆SGcgbjkFYo
2010/12/05(日) 01:48:44エラーなかったです、ありがとうございました。
後何故
typedef struct {
int a;
int b;
}
のように構造体宣言では
int a; intb;のように;がいるのでしょうか
int main(void;)とはやりませんよね?
0240デフォルトの名無しさん
2010/12/05(日) 01:52:34コンパイルして動かして確認してるんじゃないんだろうか。
0242デフォルトの名無しさん
2010/12/05(日) 01:54:23取りあえずそれ程時間かからんから↓でも一度読め。
http://homepage1.nifty.com/toshio-k/prog/c/
足し算できないのに掛け算覚えたってほとんど役に立たん。
0243デフォルトの名無しさん
2010/12/05(日) 11:22:472ch で人に聞いて勉強しようと思わずに、適当な本を買って読んでみるといい。
その上でわからないことがあれば、あらためてここにくればいい。
暗記ですまさない、ということはいい心がけだが、勉強というものは元来暗記ものだ、後からわかってくるということも多い。
>FRUIT moon(FRUIT object1, object2)
>じゃだめなんでしょうか?そうならば何故ダメなのでしょう?
そういう文法だ、としかいいようがない。関数の引数を指定するときは、いちいち引数の型を全部に書かなければならない。
0244デフォルトの名無しさん
2010/12/05(日) 11:24:49そういう文法であるから、としかいいようがない。
プログラム言語も所詮人の造りしもの。決め事の細部は開発者がえいや、ときめたところも多い。
0245デフォルトの名無しさん
2010/12/05(日) 16:29:320246デフォルトの名無しさん
2010/12/05(日) 17:31:46キチガイ乙w
0247デフォルトの名無しさん
2010/12/05(日) 18:11:36だったら普通ポインタで渡すべきなんでしょうか?
0248デフォルトの名無しさん
2010/12/05(日) 18:14:06小さい構造体なら、そのままの場合もある。
0249デフォルトの名無しさん
2010/12/05(日) 18:20:42ありがとうございました!
0250デフォルトの名無しさん
2010/12/05(日) 18:55:20ソース1 A * p = new A;←変えれない
q = p ←ここ
ソース2 関数(B型)で関数(q)として使いたい←引数の型は変えられない
の状態なのですがどうしたらいいですか?
ポインタ型のpの中身(アドレス)じゃなくてそのアドレスの中身をqに入れる感じだと思うのですがやり方がわかりません!教えてください
0251デフォルトの名無しさん
2010/12/05(日) 18:59:46日本語がおかしい
それにここC++スレじゃないから
0252デフォルトの名無しさん
2010/12/05(日) 19:02:56ごめん
0253デフォルトの名無しさん
2010/12/05(日) 19:03:16せめてソースぐらいアップロードしてくれないと説明が理解出来ない。
0254デフォルトの名無しさん
2010/12/05(日) 19:32:230255デフォルトの名無しさん
2010/12/05(日) 21:27:56http://hato.2ch.net/test/read.cgi/news/1291551909/
0256デフォルトの名無しさん
2010/12/05(日) 21:33:040257デフォルトの名無しさん
2010/12/05(日) 21:38:45struct X
{
unsigned char valid : 1 ;
unsigned char value: 7 ;
};
struct X x;
if( x.valid ) { printf( "%d", x.value ) ; }
ビットマスクとかより解かりやすいし多分早いと思うんだけど
0258デフォルトの名無しさん
2010/12/05(日) 22:01:520259デフォルトの名無しさん
2010/12/05(日) 22:04:01なんでそれをビットマスクと比較するしw
0260デフォルトの名無しさん
2010/12/05(日) 22:04:340261デフォルトの名無しさん
2010/12/05(日) 22:04:47最後の行はビットフラグの間違いでした
0262デフォルトの名無しさん
2010/12/05(日) 22:10:08特定の組み合わせを一つの変数で表現できるのでラク。
0263デフォルトの名無しさん
2010/12/05(日) 22:37:241アドレスの各ビットに機能詰め込んだとき以外は、
それ程便利とは思わんけど・・・
上記もCPU変わってエンディアン変わると後で大変だから、
面倒でも関数介してアクセスしたりしてる。
0264デフォルトの名無しさん
2010/12/05(日) 23:06:04main(int ac, char *av[]){
--ac;
*(++av);
printf("%s",*av);
}
エラーの原因がわかりませn 四行目を++av;にすると正常に動作します
なんで??
printfの引数と見比べてみておかしいとおもったんですが
0265デフォルトの名無しさん
2010/12/05(日) 23:18:29エラーにはならないだろ?
0266デフォルトの名無しさん
2010/12/05(日) 23:18:38avがアクセスオーバーランしてる
0267デフォルトの名無しさん
2010/12/05(日) 23:19:55bcc32 や gcc-4 では警告はでるにせよ、コンパイルは通り、
実行結果は第一引数の文字列を表示しています。
エラー、というのはコンパイル時の警告のことですか?
そうだったら、「*(++av) というコードが効果を持たない」という意味の警告がでます。たしかにそれはそのとおりだと思います。
0268デフォルトの名無しさん
2010/12/05(日) 23:21:39コマンドライン実行時に引数がなくても av は最終的に argv[1]= "" を指すから、オーバーランは発生していません。
0269デフォルトの名無しさん
2010/12/05(日) 23:42:48なんでエラーがでたのか謎
解決はしました ありがとう
0270デフォルトの名無しさん
2010/12/05(日) 23:45:24俺は266ではないがそんなことはない。
0271デフォルトの名無しさん
2010/12/05(日) 23:56:46例えばac==1の時にはav[0]しか指してはいけないのにav[1]を指してるだろ
0272デフォルトの名無しさん
2010/12/05(日) 23:57:390273デフォルトの名無しさん
2010/12/06(月) 00:00:54char* p0 = (char*)A;
char** p1 = &p0;
if (p1->p0) A≠の時の処理
else A=0の時の処理
0274デフォルトの名無しさん
2010/12/06(月) 00:05:00if (p1->p0) A≠0の時の処理ですか?
0275デフォルトの名無しさん
2010/12/06(月) 00:12:55Aに0とか1とか2を入れて試してみればよかろう。
0276デフォルトの名無しさん
2010/12/06(月) 00:18:21それが今if (p1->p0)のところで
0xC0000005: 場所 0xfeeefef2を読み込み中にエラーが発生しました
と出るのです。よくこれは何も入ってないポインターを使った時に出るのは経験的に知ってたのですが
delete p1,p2をしたので、elseの方に行ってほしいのですが、このエラーのせいで止まってしまうのです
どうしてでしょうか?
0277デフォルトの名無しさん
2010/12/06(月) 00:21:36自分で0を代入しないと
0278デフォルトの名無しさん
2010/12/06(月) 00:24:19#include <stdio.h>
#include <stdlib.h>
struct hoge {
char* p0;
};
int main(void) {
struct hoge obj;
struct hoge* p1 = &obj;
int a,i;
for (i=0 ; i<20 ; i++) {
a = rand()%5;
printf("%d ",obj.p0=(char*)a);
if (p1->p0) printf("true\n");
else printf("false\n");
}
return 0;
}
0279デフォルトの名無しさん
2010/12/06(月) 00:25:57そうなんですか。ありがとうございました
いいえ。この場合はav[1]を指してもよく、av[1]==NULL です。(>>268 は間違っておりました。)
一般に int main(int argc, char *argv[]) において、argv[argc] == NULL であることが保障されています。
ISO/IEC 9899:1999 5.1.2.2.1-2
0281デフォルトの名無しさん
2010/12/06(月) 00:59:230282デフォルトの名無しさん
2010/12/06(月) 01:02:44センスがあるかどうかは別として。
◆QZaw55cn4c はそれなりの知識を備えているし、
こうしてかまってもらうことで知識を増強してる。
ある意味いい勉強方法だと思うがな。
0283デフォルトの名無しさん
2010/12/06(月) 01:11:270284デフォルトの名無しさん
2010/12/06(月) 01:14:470285デフォルトの名無しさん
2010/12/06(月) 01:15:52うざいだけ
居なくても誰も困らない
むしろ初心者にとっては助かる
0286デフォルトの名無しさん
2010/12/06(月) 01:19:260287282
2010/12/06(月) 01:19:53いや、俺は別にウザイとも思わんが、
ウザイと思う人の気持ちも分かるといった程度。
スレ内で多少意固地になって反論する面もあるが、
その後のソースを見ると全く聞く耳を持たんというほどでもない。
ウザイと思われることでレスを貰い、どんどん成長していきそうだ。
そのうちウザイじゃ済まなくなるかもよ。超ウザイ。ってね。
0288デフォルトの名無しさん
2010/12/06(月) 01:25:32お前も同類だ
0289デフォルトの名無しさん
2010/12/06(月) 01:26:470290デフォルトの名無しさん
2010/12/06(月) 01:30:330291デフォルトの名無しさん
2010/12/06(月) 01:43:260292デフォルトの名無しさん
2010/12/06(月) 01:46:370293デフォルトの名無しさん
2010/12/06(月) 01:50:180294デフォルトの名無しさん
2010/12/06(月) 01:52:330295デフォルトの名無しさん
2010/12/06(月) 03:22:36HOGE(1) -> Hoge1() { Hoge2(); }
HOGE(2) -> Hoge2() { Hoge3(); }
HOGE(3) -> Hoge3() { Hoge4(); }
こんな感じで展開されるマクロってどうやって書くの?
0296デフォルトの名無しさん
2010/12/06(月) 03:30:30#define HOGE(x) Hoge##x() { Hoge##x(); }
0297デフォルトの名無しさん
2010/12/06(月) 07:03:31でさ、何回も聞くけど、どうしてC99のソースを貼るの?今聞かれているのはC89だと思うんだが
0298デフォルトの名無しさん
2010/12/06(月) 09:02:460299デフォルトの名無しさん
2010/12/06(月) 09:15:24ちげーよよく見ろうんちマン
0300デフォルトの名無しさん
2010/12/06(月) 09:18:47意味が判らんのだが、こういうことか?
for (int ic = 0; ic < num; ++ic) {
static bool static_1st = true;
if (static_1st) {
func();
static_1st = false;
}
// other sequence
}
0301デフォルトの名無しさん
2010/12/06(月) 09:36:36ありがとうございます
そんな感じです。多分。
staticをすると2週目にstatic_1stにtrueが入らないのでしょうか?
それなのに一回目にfalseを入れることが可能なのですか?どういう仕組みなのですか?
0302デフォルトの名無しさん
2010/12/06(月) 09:48:19関数の中で使われるstatic変数の実体は、
ほとんどグローバル変数と思ってよい。
下記2つはほぼ実体は同じ。
1.
int a =0;
void func() { a++; }
2.
void func() { static int a=0; a++; }
2の方は関数内でしか使えないってだけ。
初期化のタイミングはmain関数が呼ばれる前。
func関数が呼ばれるタイミングでは初期化は実行されない。
staticには色んな意味があるので、それ以外は自身で調べて欲しい。
0303デフォルトの名無しさん
2010/12/06(月) 11:19:28あーなるほど
スコープの中ではグローバル変数と同じように使えるから代入はできる
けどforループ開始前に既に実は初期化されてて、次から初期化部分は無視されるので、trueが入ることはない
こういうことですか?
0304デフォルトの名無しさん
2010/12/06(月) 12:50:510305デフォルトの名無しさん
2010/12/06(月) 12:53:280306デフォルトの名無しさん
2010/12/06(月) 12:55:460307デフォルトの名無しさん
2010/12/06(月) 15:23:230308デフォルトの名無しさん
2010/12/06(月) 15:44:49そんな感じで食傷気味です。多分
0309デフォルトの名無しさん
2010/12/06(月) 17:03:09教科書のプログラム例で説明なかったんで・・・
極々簡単な例で教えてくれませんでしょうか?
0310デフォルトの名無しさん
2010/12/06(月) 17:05:16#include <stdlib.h>
int main(){
char * p;
p = malloc(1);
*p = 'c';
}
0311デフォルトの名無しさん
2010/12/06(月) 17:07:56ほうほう
char型ポインタpはmalloc(1)をどうするのでしょう?
malloc(1)は何でしょうか?
0312デフォルトの名無しさん
2010/12/06(月) 17:14:11int *p = malloc(sizeof(int)*10) ;//int10個分のメモリ確保
for ( i = 0 ; i < 10 ; i++ ){
p[i] = i ;//配列として扱える
}
for ( i = 0 ; i < 10 ; i++ ){
printf ( "%d\n", *(p+i) ) ;//もちろんポインタとしても使える
}
free(p);// 確保したメモリ解放
0313デフォルトの名無しさん
2010/12/06(月) 17:17:48sizeof、freeの二つがわかりません・・すいません。
0314デフォルトの名無しさん
2010/12/06(月) 17:18:250315デフォルトの名無しさん
2010/12/06(月) 17:21:09本当にありがとうございました
0316デフォルトの名無しさん
2010/12/06(月) 17:25:35freeはポインタが指す領域を解放する関数
うーん、良く意味がわからないなぁ。
メモリを確保ってどういうことでしょうか?
0317デフォルトの名無しさん
2010/12/06(月) 17:32:460318デフォルトの名無しさん
2010/12/06(月) 17:34:220319デフォルトの名無しさん
2010/12/06(月) 17:35:24int a[10];
でいいけど
プログラムの計算結果で欲しい数が100個だったり200個だったり決まってない場合
int n=100;
int a[n];
みたいに変数を配列の数にしたい所だが実際は出来なかった(C99からはできる)
なので
int* p = malloc(sizeof(int)*n) ;
のようにして必要な数だけメモリを確保する必要があった
0320デフォルトの名無しさん
2010/12/06(月) 17:38:53int a[10]とした時点で4byteのメモリが10個確保されるけど
変数個の場合は確保できないってことですね?
出来なかったってどいうことですか?理論的に無理じゃなかった
ってことですか?
0321デフォルトの名無しさん
2010/12/06(月) 17:41:37わかりやすすぎワロタw
プログラムやってると頭悪い奴と頭良い奴の差が本当に出るなぁ。
0322デフォルトの名無しさん
2010/12/06(月) 17:42:400323デフォルトの名無しさん
2010/12/06(月) 17:44:08人に物を教えるには3倍理解していないといけない。
0324デフォルトの名無しさん
2010/12/06(月) 17:44:33メモリ確保するんじゃないんですか?
0325デフォルトの名無しさん
2010/12/06(月) 17:46:00int i; double d[10]; などとして変数や配列が使えるのは、スタックと呼ばれるメモリがすでに確保されているから。
ただし、スタックの量は限られているため、あまり大量に使う事ができない。
そこで、大量のメモリが必要な場合は、ヒープと呼ばれるスタックよりも広いメモリ領域から確保してくる。
そのための関数が malloc() で、引数に指定されたバイト数の領域をヒープから確保してくる。
また、C99 未対応の C 処理系や C++ などでは double d[n]; のように要素数が定数でない配列は確保できないので、
この場合も malloc() で (C++ では new 演算子も使い)、ヒープからメモリを確保する。
0326デフォルトの名無しさん
2010/12/06(月) 17:48:46処理にはメモリが必要だけど、確保してないとその範囲内で
処理できないってことですね。
0327デフォルトの名無しさん
2010/12/06(月) 17:50:22限られてるといってもスタック1MBくらいあるもんな
0328デフォルトの名無しさん
2010/12/06(月) 17:52:530329デフォルトの名無しさん
2010/12/06(月) 18:03:14計算に必要なメモリ=計算に使う変数のメモリだから
多分
0330デフォルトの名無しさん
2010/12/06(月) 18:05:19その計算に必要な量のメモリが分かっているから
int a[n];
のようにコンパイル時にサイズが解決できない宣言はエラーとなる
0331デフォルトの名無しさん
2010/12/06(月) 18:14:55C言語でGoogleカレンダーに食わせるCSVを作成するツールを作成中です。
Googleカレンダーの仕様上、CSVの日本語部分がUTF-8でなくては文字化けが起こります。
Cでファイルに書き込む時に、明示的に文字コードをUTF-8に指定する方法を教えていただきたいです。
よろしくお願いいたします。
■ このスレッドは過去ログ倉庫に格納されています