トップページ⇒tech
1001コメント248KB

C言語なら俺に聞け(入門編)Part 74

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG?S★(532000)
C言語の*入門者*向け解説スレッドです。
★前スレ
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
>>231
これ以上引き延ばすんじゃない
0233207 ◆SGcgbjkFYo 2010/12/05(日) 00:49:47
色々厳しいけど最終的に教えてくれるので感謝してます。
ありがとうございました。
0234デフォルトの名無しさん2010/12/05(日) 00:52:33
ボーランドとcygwinってなにが違うんですか?
0235デフォルトの名無しさん2010/12/05(日) 01:25:10
>>233
嫌味じゃないがまぁもうちょっと勉強した方が良いな。
あんまり変な質問したらこのスレだと結構叩かれるからなw
0236デフォルトの名無しさん2010/12/05(日) 01:29:34
>>225と>>207ってほとんど変わらんじゃん、何が悪かったんだろう。
0237デフォルトの名無しさん2010/12/05(日) 01:37:06
ほとんど変わらないなら、わずかに違ってる部分こそが問題だってわかるだろうに
0238207 ◆SGcgbjkFYo 2010/12/05(日) 01:47:14
>>225
7行目の
FRUIT moon(FRUIT object1, FRUIT object2)
は
FRUIT moon(FRUIT object1, object2)
じゃだめなんでしょうか?そうならば何故ダメなのでしょう?
0239207 ◆SGcgbjkFYo 2010/12/05(日) 01:48:44
一応>>225でエラーチェッカーしましたが
エラーなかったです、ありがとうございました。

後何故
typedef struct {
int a;
int b;
}

のように構造体宣言では
int a; intb;のように;がいるのでしょうか
int main(void;)とはやりませんよね?
0240デフォルトの名無しさん2010/12/05(日) 01:52:34
エラーチェッカーってなんだろう。
コンパイルして動かして確認してるんじゃないんだろうか。
0241207 ◆SGcgbjkFYo 2010/12/05(日) 01:53:56
>>240
コンパイルしてエラーチェッカーしました・・
ノンエラーでした・・
0242デフォルトの名無しさん2010/12/05(日) 01:54:23
>>239
取りあえずそれ程時間かからんから↓でも一度読め。
http://homepage1.nifty.com/toshio-k/prog/c/
足し算できないのに掛け算覚えたってほとんど役に立たん。
0243デフォルトの名無しさん2010/12/05(日) 11:22:47
>>238
2ch で人に聞いて勉強しようと思わずに、適当な本を買って読んでみるといい。
その上でわからないことがあれば、あらためてここにくればいい。
暗記ですまさない、ということはいい心がけだが、勉強というものは元来暗記ものだ、後からわかってくるということも多い。

>FRUIT moon(FRUIT object1, object2)
>じゃだめなんでしょうか?そうならば何故ダメなのでしょう?
そういう文法だ、としかいいようがない。関数の引数を指定するときは、いちいち引数の型を全部に書かなければならない。
0244デフォルトの名無しさん2010/12/05(日) 11:24:49
>>239
そういう文法であるから、としかいいようがない。
プログラム言語も所詮人の造りしもの。決め事の細部は開発者がえいや、ときめたところも多い。
0245デフォルトの名無しさん2010/12/05(日) 16:29:32
ふっほっ
0246デフォルトの名無しさん2010/12/05(日) 17:31:46
>>245
キチガイ乙w
0247デフォルトの名無しさん2010/12/05(日) 18:11:36
C だと構造体って中に配列が入っててもまるごとコピーされるんだよね?
だったら普通ポインタで渡すべきなんでしょうか?
0248デフォルトの名無しさん2010/12/05(日) 18:14:06
普通ポインターでやりとりする場合が多い。
小さい構造体なら、そのままの場合もある。
0249デフォルトの名無しさん2010/12/05(日) 18:20:42
>>248
ありがとうございました!
0250デフォルトの名無しさん2010/12/05(日) 18:55:20
ヘッダ struct A : public B{};←変えれない
ソース1 A * p = new A;←変えれない
      q = p ←ここ
ソース2 関数(B型)で関数(q)として使いたい←引数の型は変えられない
の状態なのですがどうしたらいいですか?
ポインタ型のpの中身(アドレス)じゃなくてそのアドレスの中身をqに入れる感じだと思うのですがやり方がわかりません!教えてください

0251デフォルトの名無しさん2010/12/05(日) 18:59:46
>>250
日本語がおかしい
それにここC++スレじゃないから
0252デフォルトの名無しさん2010/12/05(日) 19:02:56
>>251
ごめん
0253デフォルトの名無しさん2010/12/05(日) 19:03:16
>>250
せめてソースぐらいアップロードしてくれないと説明が理解出来ない。
0254デフォルトの名無しさん2010/12/05(日) 19:32:23
ほっほっ
0255デフォルトの名無しさん2010/12/05(日) 21:27:56
「C言語すら知らなかった私が2カ月でiPhoneアプリをリリース」 はてなで話題に
http://hato.2ch.net/test/read.cgi/news/1291551909/
0256デフォルトの名無しさん2010/12/05(日) 21:33:04
さっき見たけど別に凄くないな
0257デフォルトの名無しさん2010/12/05(日) 21:38:45
ビットフィールドってビットフラグに比べてあんまし見かけない気がするんだけどなんか問題でもあるの?
struct 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:52
使う必然性がないからだよ。
0259デフォルトの名無しさん2010/12/05(日) 22:04:01
>>257
なんでそれをビットマスクと比較するしw
0260デフォルトの名無しさん2010/12/05(日) 22:04:34
ちなみにビットフィールドに使える型はint, signed int, unsigned int, _Boolだけ
0261デフォルトの名無しさん2010/12/05(日) 22:04:47
>>259
最後の行はビットフラグの間違いでした
0262デフォルトの名無しさん2010/12/05(日) 22:10:08
フラグはフラグで、論理積とか取って一発で比較するので便利。
特定の組み合わせを一つの変数で表現できるのでラク。
0263デフォルトの名無しさん2010/12/05(日) 22:37:24
ビットフィールドってハード屋が、
1アドレスの各ビットに機能詰め込んだとき以外は、
それ程便利とは思わんけど・・・
上記もCPU変わってエンディアン変わると後で大変だから、
面倒でも関数介してアクセスしたりしてる。
0264デフォルトの名無しさん2010/12/05(日) 23:06:04
#include<stdio.h>
main(int ac, char *av[]){
--ac;
*(++av);
printf("%s",*av);
}

エラーの原因がわかりませn 四行目を++av;にすると正常に動作します
なんで??
printfの引数と見比べてみておかしいとおもったんですが
0265デフォルトの名無しさん2010/12/05(日) 23:18:29
>>264
エラーにはならないだろ?
0266デフォルトの名無しさん2010/12/05(日) 23:18:38
>>264
avがアクセスオーバーランしてる
0267デフォルトの名無しさん2010/12/05(日) 23:19:55
>>264
bcc32 や gcc-4 では警告はでるにせよ、コンパイルは通り、
実行結果は第一引数の文字列を表示しています。
エラー、というのはコンパイル時の警告のことですか?
そうだったら、「*(++av) というコードが効果を持たない」という意味の警告がでます。たしかにそれはそのとおりだと思います。
0268デフォルトの名無しさん2010/12/05(日) 23:21:39
>>266
コマンドライン実行時に引数がなくても av は最終的に argv[1]= "" を指すから、オーバーランは発生していません。
0269デフォルトの名無しさん2010/12/05(日) 23:42:48
もう一回コンパイルしたら警告もエラーもでなかった
なんでエラーがでたのか謎 

解決はしました ありがとう
0270デフォルトの名無しさん2010/12/05(日) 23:45:24
>>268
俺は266ではないがそんなことはない。
0271デフォルトの名無しさん2010/12/05(日) 23:56:46
>>268
例えばac==1の時にはav[0]しか指してはいけないのにav[1]を指してるだろ
0272デフォルトの名無しさん2010/12/05(日) 23:57:39
if(ポインタ→ポインタ)ってどういう判定基準なんですか?
0273デフォルトの名無しさん2010/12/06(月) 00:00:54
>>272
char* p0 = (char*)A;
char** p1 = &p0;
if (p1->p0) A≠の時の処理
else A=0の時の処理
0274デフォルトの名無しさん2010/12/06(月) 00:05:00
>>273
if (p1->p0) A≠0の時の処理ですか?
0275デフォルトの名無しさん2010/12/06(月) 00:12:55
>>274
Aに0とか1とか2を入れて試してみればよかろう。
0276デフォルトの名無しさん2010/12/06(月) 00:18:21
>>275
それが今if (p1->p0)のところで
0xC0000005: 場所 0xfeeefef2を読み込み中にエラーが発生しました
と出るのです。よくこれは何も入ってないポインターを使った時に出るのは経験的に知ってたのですが
delete p1,p2をしたので、elseの方に行ってほしいのですが、このエラーのせいで止まってしまうのです
どうしてでしょうか?
0277デフォルトの名無しさん2010/12/06(月) 00:21:36
deleteしても0は入らないよ
自分で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
>>277
そうなんですか。ありがとうございました
0280 ◆QZaw55cn4c 2010/12/06(月) 00:58:43
>>271
いいえ。この場合は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:23
うぜー
0282デフォルトの名無しさん2010/12/06(月) 01:02:44
そんなウザがるなって。
センスがあるかどうかは別として。
◆QZaw55cn4c はそれなりの知識を備えているし、
こうしてかまってもらうことで知識を増強してる。
ある意味いい勉強方法だと思うがな。
0283デフォルトの名無しさん2010/12/06(月) 01:11:27
でもうぜーよな?
0284デフォルトの名無しさん2010/12/06(月) 01:14:47
NULL終端になるって知らんかったわ
0285デフォルトの名無しさん2010/12/06(月) 01:15:52
ねーよ
うざいだけ
居なくても誰も困らない
むしろ初心者にとっては助かる
0286デフォルトの名無しさん2010/12/06(月) 01:19:26
ぶはっぶはっ
02872822010/12/06(月) 01:19:53
>>283
いや、俺は別にウザイとも思わんが、
ウザイと思う人の気持ちも分かるといった程度。
スレ内で多少意固地になって反論する面もあるが、
その後のソースを見ると全く聞く耳を持たんというほどでもない。
ウザイと思われることでレスを貰い、どんどん成長していきそうだ。
そのうちウザイじゃ済まなくなるかもよ。超ウザイ。ってね。
0288デフォルトの名無しさん2010/12/06(月) 01:25:32
理解した
お前も同類だ
0289デフォルトの名無しさん2010/12/06(月) 01:26:47
282もうざいから消えていいよ
0290デフォルトの名無しさん2010/12/06(月) 01:30:33
分かったよ。名無しにもどるわ。
0291デフォルトの名無しさん2010/12/06(月) 01:43:26
俺は勉強になったけどな。
0292デフォルトの名無しさん2010/12/06(月) 01:46:37
俺は天使になったけどな。
0293デフォルトの名無しさん2010/12/06(月) 01:50:18
◆QZaw55cn4c は自分を分析されるのが嫌いだと見た。
0294デフォルトの名無しさん2010/12/06(月) 01:52:33
どこで?
0295デフォルトの名無しさん2010/12/06(月) 03:22:36
#define HOGE(N) ???

HOGE(1) -> Hoge1() { Hoge2(); }
HOGE(2) -> Hoge2() { Hoge3(); }
HOGE(3) -> Hoge3() { Hoge4(); }

こんな感じで展開されるマクロってどうやって書くの?
0296デフォルトの名無しさん2010/12/06(月) 03:30:30
>>295
#define HOGE(x) Hoge##x() { Hoge##x(); }
0297デフォルトの名無しさん2010/12/06(月) 07:03:31
>>280
でさ、何回も聞くけど、どうしてC99のソースを貼るの?今聞かれているのはC89だと思うんだが
0298デフォルトの名無しさん2010/12/06(月) 09:02:46
ループの中で一回だけその処理をしてその後はまるで//されたみたいにさせる関数はありませんか?
0299デフォルトの名無しさん2010/12/06(月) 09:15:24
>>296
ちげーよよく見ろうんちマン
0300デフォルトの名無しさん2010/12/06(月) 09:18:47
>>298
意味が判らんのだが、こういうことか?
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
>>300
ありがとうございます
そんな感じです。多分。
staticをすると2週目にstatic_1stにtrueが入らないのでしょうか?
それなのに一回目にfalseを入れることが可能なのですか?どういう仕組みなのですか?
0302デフォルトの名無しさん2010/12/06(月) 09:48:19
>>301
関数の中で使われる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
>>302
あーなるほど
スコープの中ではグローバル変数と同じように使えるから代入はできる
けどforループ開始前に既に実は初期化されてて、次から初期化部分は無視されるので、trueが入ることはない
こういうことですか?

0304デフォルトの名無しさん2010/12/06(月) 12:50:51
え?
0305デフォルトの名無しさん2010/12/06(月) 12:53:28
ふっほっ
0306デフォルトの名無しさん2010/12/06(月) 12:55:46
それよりstatic変数でその使い方じゃループ全体が二回目呼ばれたときまずくね?
0307デフォルトの名無しさん2010/12/06(月) 15:23:23
二回目呼ばれた時も実行しない仕様なんだと思って読んでたけど
0308デフォルトの名無しさん2010/12/06(月) 15:44:49
ありがとうございます
そんな感じで食傷気味です。多分
0309デフォルトの名無しさん2010/12/06(月) 17:03:09
すいません、mallocって何ですか?
教科書のプログラム例で説明なかったんで・・・
極々簡単な例で教えてくれませんでしょうか?
0310デフォルトの名無しさん2010/12/06(月) 17:05:16
>>309
#include <stdlib.h>

int main(){
char * p;
p = malloc(1);
*p = 'c';
}
0311デフォルトの名無しさん2010/12/06(月) 17:07:56
>>310
ほうほう

char型ポインタpはmalloc(1)をどうするのでしょう?
malloc(1)は何でしょうか?
0312デフォルトの名無しさん2010/12/06(月) 17:14:11
int i;
int *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:48
>>312
sizeof、freeの二つがわかりません・・すいません。
0314デフォルトの名無しさん2010/12/06(月) 17:18:25
ggrks
0315デフォルトの名無しさん2010/12/06(月) 17:21:09
どうみても釣りです
本当にありがとうございました
0316デフォルトの名無しさん2010/12/06(月) 17:25:35
sizeofはメモリの大きさを出す関数
freeはポインタが指す領域を解放する関数

うーん、良く意味がわからないなぁ。

メモリを確保ってどういうことでしょうか?
0317デフォルトの名無しさん2010/12/06(月) 17:32:46
作業台になる机を借りるんだよ
0318デフォルトの名無しさん2010/12/06(月) 17:34:22
では全てのプログラムはmalloc関数が必要なのですか?
0319デフォルトの名無しさん2010/12/06(月) 17:35:24
int「10個分」の配列が欲しいと最初から分かってるなら
int a[10];
でいいけど
プログラムの計算結果で欲しい数が100個だったり200個だったり決まってない場合
int n=100;
int a[n];
みたいに変数を配列の数にしたい所だが実際は出来なかった(C99からはできる)
なので
int* p = malloc(sizeof(int)*n) ;
のようにして必要な数だけメモリを確保する必要があった
0320デフォルトの名無しさん2010/12/06(月) 17:38:53
>>319
int a[10]とした時点で4byteのメモリが10個確保されるけど
変数個の場合は確保できないってことですね?
出来なかったってどいうことですか?理論的に無理じゃなかった
ってことですか?
0321デフォルトの名無しさん2010/12/06(月) 17:41:37
>>319
わかりやすすぎワロタw
プログラムやってると頭悪い奴と頭良い奴の差が本当に出るなぁ。
0322デフォルトの名無しさん2010/12/06(月) 17:42:40
age
0323デフォルトの名無しさん2010/12/06(月) 17:44:08
教えるのが下手なやつは教えれるほど理解していない。
人に物を教えるには3倍理解していないといけない。
0324デフォルトの名無しさん2010/12/06(月) 17:44:33
プログラミングって実行したら自動的に必要な分だけ
メモリ確保するんじゃないんですか?
0325デフォルトの名無しさん2010/12/06(月) 17:46:00
基本的に、変数や配列の内容を記憶するメモリは確保しないと使えない。

int 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:53
何で計算など複雑な処理をするメモリは確保してなくても使えるのですか?
0329デフォルトの名無しさん2010/12/06(月) 18:03:14
>>328
計算に必要なメモリ=計算に使う変数のメモリだから
多分
0330デフォルトの名無しさん2010/12/06(月) 18:05:19
どんな複雑な計算だろうがコンパイル時には既に
その計算に必要な量のメモリが分かっているから

int a[n];
のようにコンパイル時にサイズが解決できない宣言はエラーとなる
0331デフォルトの名無しさん2010/12/06(月) 18:14:55
お願いします。

C言語でGoogleカレンダーに食わせるCSVを作成するツールを作成中です。
Googleカレンダーの仕様上、CSVの日本語部分がUTF-8でなくては文字化けが起こります。
Cでファイルに書き込む時に、明示的に文字コードをUTF-8に指定する方法を教えていただきたいです。

よろしくお願いいたします。
■ このスレッドは過去ログ倉庫に格納されています