[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/09 11:53 / Filesize : 185 KB / Number-of Response : 845
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 15



1 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 06:14:52 ]
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 14
pc11.2ch.net/test/read.cgi/tech/1181735298/


教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 91代目
pc11.2ch.net/test/read.cgi/tech/1182607405/

673 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 20:42:44 ]
ソース見た瞬間意識が朦朧としてきた

674 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 20:49:51 ]
>672
文字列の終端は'\n'じゃない
てめえの汚えケツ穴なんぞ誰がいるかってんだ

675 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:05:09 ]
>>673
朦朧としてると、こっちから押し倒しちゃうze(はぁと

>>674
ありがちんこ☆
\0か!


676 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:09:59 ]
あえて断言しよう

>>674は絶好のチャンスを失った、と。


677 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:12:21 ]
>>670
#include <unistd.h>
int main(int argc, char *argv[]){return execlp("cal", "cal", argv[2], argv[1], NULL);}


678 名前:デフォルトの名無しさん mailto:age [2007/07/04(水) 21:14:37 ]
例えば、以下のような4つの要素からなる列が複数あるものに対して、
次のような処理:
(1)1番目の要素が同一の場合、後から出現したものを採用する
(2)3番目の要素でソートする
を行いたいのですが、どのようなアルゴリズムになりますか?

例)
0010 ABC 60 70
0022 BCD 56 76
0010 EFG 85 34
0003 HIJ 70 98



0010 EFG 85 34
0003 HIJ 70 98
0022 BCD 56 76


679 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:15:51 ]
普通に配列につめてソートします。

680 名前:678 mailto:age [2007/07/04(水) 21:50:09 ]
>>679
普通に配列からソートする場合、
どのように(1)の条件をクリアしますか?
そこで困っています。

681 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:59:03 ]
同じものが出てきたら上書きする



682 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:25:35 ]
1番目の要素が同一かどうか調べて、同一なら上書きすればいい(例だと、消去してる?)

683 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:29:19 ]
>>680
0000番から9999番までの箱を用意してそれぞれの箱に入れていく。
で、既に入ってる場合は入ってるものを捨てて代わりを入れる。

全部入れ終わったらソート。

無駄だらけだけど分かりやすい考え方だとこんな感じ?

684 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:30:50 ]
int i, j, k, n;
for(i=n-1; i> 0; i--) {
   for(j=i-1; j>=0; j--) {
      if(a[j]==a[i]) {
         for(k=j; k<n-1; k++) a[k] = a[k+1];
         n--;
         i--;
      }
   }
}
こんな感じで同じものを消去すりゃいいんじゃね?

685 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:31:14 ]
ソートしてからの方が効率いいだろ・・・

686 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:34:55 ]
>>685
ソートしちゃうとどれが先にでてきたか分からなくならない?
いや、マージソートとかならいいけど

687 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:38:45 ]
>>686
そのための安定ソートだろ
入門篇ならバブルソートだろう

688 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:44:16 ]
>>685
ソートは3番目の要素でするんだぞ?

689 名前:678 mailto:age [2007/07/04(水) 22:45:58 ]
>>683
それ考えたんですけど、
実際は0000000000番から9999999999番まで(10桁)あり、
番号も全部あるわけじゃないからやっぱり効率悪いですよね。
はやさも求められているんで・・・

ハッシュとか2分探索とか使うんですかね?

690 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:50:51 ]
>688
一番目の要素で安定ソート
一番目の要素でのかぶりを削除
三番目の要素でソート
ってことだろ。

691 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:53:29 ]
インデックス情報を付加しといて qsort という手もある。



692 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:05:49 ]
標準ライブラリに無いのが難点だけど
重複してるかどうか調べるのはハッシュ使うのがいいと思う

693 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:08:01 ]
インデックス用の配列mallocしてqsortが一番楽だろ

694 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 09:38:27 ]
>>672
それどっかの入門書に載ってたぞ

695 名前:デフォルトの名無しさん [2007/07/05(木) 15:50:14 ]
CからつかえるフリーのXMLライブラリないですか?

696 名前:デフォルトの名無しさん [2007/07/05(木) 15:53:13 ]
何方か標準関数のプログラムの作り方教えてください

697 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 15:54:07 ]
日本語でもう一度

698 名前:デフォルトの名無しさん [2007/07/05(木) 15:55:33 ]
>>672見たらmain内で関数宣言してるけど、これはなに?
そういう手法があるの?関数の内容よりそっちに目がいった。
こんなことしたことないけど、どうなの?

699 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 15:58:24 ]
そりゃキミが知らないだけだろ

700 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 16:06:00 ]
プロトタイプ宣言くらい関数内でできる。

701 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 16:41:17 ]
次のような関数を作りました。
Vertices isMaxNoVer(Vertices R[]){
  Vertices max;
  int i, count=0;

  max.num = 0;
  max.deg = 0;
  max.no = 0;

  count = countVer(R);

  for(i=0; i<count-1; i++){
    if(max.no < R[i].no){
      max = R[i];
    }
  }

  return max;
}


この関数を、次の再帰関数を使って二度目に呼び出した時、
動作がおかしくなり、以下のようなおかしな値が入ります。
test expand 1, 8 -1073747304 134516287
更にその後2度目のtest expand 3に入る前に
セグメントエラーを起こして止まってしまいます。
これだけの情報でわかって頂けるかわかりませんが、
誰か助けてください。



702 名前:701 mailto:sage [2007/07/05(木) 16:42:43 ]
void expand(Vertices R[]){
  Vertices p, buf[N], Rp[N];

  while(countVer(R) != 0){
    p = isMaxNoVer(R);

    printf("test expand 1, %d %d %d\n", p.num, p.deg, p.no);
 
    if((countVer(Q) + p.no) > countVer(Qmax)){
      syokikaVer(buf);
      mataha(Q, p);
      printf("test expand 2\n");
      syokikaVer(buf);
      ganma(buf, p.no, G);
      printf("test expand 3\n");
      syokikaVer(Rp);
      katu(Rp, buf, R);
      printf("test expand 4\n");

703 名前:701 mailto:sage [2007/07/05(木) 16:44:38 ]
      if(countVer(Rp) != 0){
numberSort(Rp);
expand(Rp);
      }
      else if(countVer(Q) > countVer(Qmax)){
copyVer(Qmax, Q);
      }
      hiku(p, Q);
    }
    else return;
    hiku(p, R);
  }
  return;
}

QやQmax、Gはグローバル変数です。

704 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 18:03:30 ]
>>701
それだけだと分からんなぁ〜
katu(Rp, buf, R);
numberSort(Rp);
このへんの関数に問題ありそうだけど

705 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 18:29:52 ]
質問です。
今、以下のような関数と構造体を作ったのですが、

typedef struct
{
    int Length, Maximam, ValueSize;
    void* Array;
} ArrayList;

char* GetValue(ArrayList* list, int index)
{
    char* data = (char*)list->Array, item = malloc(list->ValueSize);
    int i = 0;
    unsigned int p = index * list->ValueSize;
    if(list->Length > index && item != NULL) {
        for(; i < list->ValueSize; i++) {
            item[i] = data[p + i];
        }
        return item;
    } else {
        return NULL;
    }
}

以下続く

706 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 18:33:11 ]
item

707 名前:705 mailto:sage [2007/07/05(木) 18:33:11 ]
void AddRange(ArrayList* list, const void* values, int length)
{
    char* data = (char*)list->Array, item = (char*)values;
    unsigned int i = 0, itemlength = length * list->Maximam, index = list->Length * list->ValueSize;
    if(list->Length + length >= list->Maximam) {
        list->Maximam += length * 2;
        list->Array = realloc(list->Array, list->ValueSize * list->Maximam);
    } for(; i < itemlength; i++) { data[index + i] = item[i]; }
    list->Length += length;
}

void main (void)
{
    ArrayList list = { 0, 4, sizeof(int), malloc(sizeof(int) * 4) };
    int i = 0;
    int s[10] = { 0, 1, 2, 3, 4, 5, 6 ,7 ,8 ,9 };
    AddRange(&list, s, 10); AddRange(&list, s, 10);
    for(; i < list.Length; i++) { printf("%d\n", *((int*)GetValue(&list, i))); }
}

どうしてもGetValueのchar* itemの領域が確保できないんです。
他にも、listのArrayをいじってもヒープが壊れてますとか言われるのですが…
なにかやってはいけないことでもやってしまっているのでしょうか?
行数圧縮しているため読みにくいとは思いますが、よろしくお願いします。

708 名前:705 mailto:sage [2007/07/05(木) 18:34:36 ]
ちなみに、元のソースではすべて

int i = 0;
int j = 0;

のように宣言しています。

709 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 18:38:04 ]
itemはchar型変数として宣言されてる
*itemで宣言しなきゃダメだろ

710 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 18:41:16 ]
>>709
元ソースでは
char*になってたんですが…
削りすぎた orz

711 名前:705 mailto:sage [2007/07/05(木) 19:07:04 ]
いろいろ試してみたのですが、
AddRange(&list, s, 10);を
連続でなくとも2回使用するとGetValueのitemの中がNULLに、
3回目からはAddRange(&list, s, 10);で行われるreallocで
ヒープが壊れているというエラーが出てくるようです。

何が悪いんだろ orz



712 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 19:09:20 ]
AddRangeの2回目でヒープ壊してる
itemlengthとreallocのサイズが乖離してる

713 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 19:17:30 ]
つーかGetValue()って範囲チェック除けば
char *GetValue(ArrayList list, int index)
{
return (char*)list.Array + index * list.ValueSize;
}
これで十分じゃね?

714 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 19:24:04 ]
itemlength = length * list->Maximam → itemlength = length * list->ValueSize
でいけるかな?


715 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 19:29:48 ]
>>712
itemlength = length * list->Maximam
のMaximamが原因でした。ValueSizeにするはずだったのに…
1回の使用だけだとエラーが出なかったので問題ないと思い込んで
気づかなかった orz

>>713
そんなやり方もあったんですか…
void*だとサイズわかんねぇよって怒られるのでchar*にして
コピーする方法しか知りませんでした。

>>714
全くその通りです。
まともにコードかけるようになるのは時間がかかりそうだ orz

ありがとうございました!

716 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 19:34:00 ]
素直に型を限定すればいいのに

717 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 21:55:47 ]
int型の数字を文字列に変換するのってどうやるん?
具体的に言うと
int n = 34;
char* nStr = intToStr( n ); /* nStr = "34" */
という風にしたいのだけれど。

718 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 22:03:14 ]
char *buf;
int n=34;
buf=メモリ確保
ssprintf(buf,"%d",n);

719 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 22:05:12 ]
>>717
sが一個多かった
sprintf


720 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 22:35:49 ]
>>718
サンキュ!
inline char* int2str( int n )
{
char *buffer;
buffer = malloc( sizeof( char ) );
sprintf( buffer, "%d", n );
return buffer != NULL ?
buffer:
"FAULT!!";
}
一応こういう感じで。

721 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 22:43:17 ]
>>720
>buffer = malloc( sizeof( char ) );
1バイトしか確保できないよ
'\0'しか格納できない
もう少し多めに確保して
>return buffer != NULL ? buffer:"FAULT!!";
buffer の確保が失敗した場合 sprintf( buffer, "%d", n ); でエラーが出る
buffer = malloc( sizeof( char ) );
if(buffer){
sprintf( buffer, "%d", n );
return buffer;
}
else {
return "FAULT!!";
}
のほうがいい気がする



722 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 22:57:49 ]
>>721
せっかくならmallocも直してやれよw
11桁くらい確保すれば十分の気がする

723 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:16:28 ]
>>720
んじゃ buffer = malloc(sizeof( char ) *12);
または buffer = malloc(12);

>>722
符号付の場合、'\0'いれると12文字になる

724 名前:デフォルトの名無しさん [2007/07/05(木) 23:40:25 ]

最強の関数教えてください


725 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:42:07 ]
VIPでやれ

726 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:42:25 ]
どう考えても main だろ。

727 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:43:51 ]
>>724
abort

728 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:49:33 ]
exit

729 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:35:39 ]
buffer = (char*)malloc(sizeof( char ) *12);
        ↑これは?

730 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:36:56 ]
bufferの型にあわせてあるんだろ。
C++じゃ必須の書き方だがCじゃいらん。

731 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:47:14 ]
CとかC++の問題じゃねーだろ・・・知ったかの初心者がレスしてんのか、ここは?
キャスト演算子とか知ってなさそうだな・・・平気で型の違う変数をキャスト演算子なしで
代入しちゃうようなヘボプログラマーかw



732 名前:デフォルトの名無しさん [2007/07/06(金) 01:48:12 ]
配列の添え字に変数を指定することは可能でしょうか?


733 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:54:01 ]
コンパイラが自動的にやってくれるのを当てにして失敗するプログラマー(プ

734 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:56:50 ]
>>730 (・∀・)ニヤニヤ
> bufferの型にあわせてあるんだろ。
> C++じゃ必須の書き方だがCじゃいらん。

735 名前:732 mailto:sage [2007/07/06(金) 01:57:25 ]
自己解決しました
可能っぽいですね

736 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:01:26 ]
>>730 (・∀・)y-~~~ ヤニヤニ

737 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:01:26 ]
C だと void* から別のポインタ型への変換は暗黙にできるだろ・・・常識的に考えて。

738 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:04:22 ]
void*が無かった頃のCならmallocはchar*を返したから
キャストしないと警告もんだとか言い出してみる。

739 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:04:47 ]
>>730 (・∀・)ニヤニヤ ヘボプログラマー必死だな

740 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:08:16 ]
>>738
malloc で気を使っても、
どっかで void* 使ってたらそれだけでアウツだけどな。
その環境なら。

741 名前:732 ◆L/nntMgEC6 [2007/07/06(金) 02:11:36 ]
>>735
可能なんですか?



742 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:12:01 ]
>>730 (・∀・)ニヤニヤ あるんだろ。Cじゃいらん。

743 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:24:21 ]
>>738 (・∀・)ニヤニヤ
> void*が無かった頃のCなら

744 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:27:29 ]
>>732
char a[10];
int i;

でa[i]ってことですか?
もちろん可能。

添え字は整数の値をとる式ならなんでもおkだぞ。

745 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:29:22 ]
>>744 (・∀・)ニヤニヤ
> 添え字は整数の値をとる式ならなんでもおkだぞ。

(VIPPERのAA略)<常識的に考えて配列の要素番号の範囲内だろ

746 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:33:49 ]
アホが常駐しとるな

747 名前:744 mailto:sage [2007/07/06(金) 02:34:12 ]
>>745
おまい!大丈夫か!
>>732は文法的に許されるかと質問しているんだろ!

748 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:34:50 ]
よい子がC言語の勉強実況してるからみてやろうぜ
WMPのファイル→URLを開く→matoinu.orz.hm:30000をコピペ→OK

実況スレ
何でも実況V なんでも実況フリーダム
live24.2ch.net/test/read.cgi/livevenus/1183654888/

面白いぜwwwwww



749 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:38:25 ]
範囲外まで指定できちゃうのがエラーの温床になってるしな。

750 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:40:29 ]
とりあえず (・∀・)ニヤニヤ を NG にした。

751 名前:732 ◆L/nntMgEC6 [2007/07/06(金) 02:42:37 ]
>>744さん
回答有難う御座います。

int i;
char a[]="abc";
i=strlen(a);
char b[i];

のような感じで使いたいのですが、可能でしょうか?



752 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:44:57 ]
>>747 (・∀・)ニヤニヤ 適切と不適切がわからないプログラマーワロスw
キャストは不要でつか〜〜〜?

753 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:46:39 ]
746 名前:デフォルトの名無しさん 投稿日:2007/07/06(金) 02:33:49
アホが常駐しとるな

(VIPPERのAA略) < 常識的に考えて知ったかぶって初心者にありもしないことを言う方がおかしいだろ
どう考えて配列を適切に参照できる、要素番号の範囲内の値をとる式ならって話ならわかるけどw

754 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:48:03 ]
とりあえず (VIPPERのAA略) を NG にした

755 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:49:35 ]
>>744 (^∀^) ニタニタ
> 添え字は整数の値をとる式ならなんでもおkだぞ。
整数の値をとる式ならなんでも 整数の値をとる式ならなんでも
こやつは要素数と参照できる範囲外の値をとってもおkなんだぞぉーーー!

756 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:50:28 ]
>>744 m9(^д^)9m プププ、(ダブル)プギャー

757 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:53:33 ]
文体変えてAA使っても、いつものアホだってことはバレバレ

758 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:53:52 ]
>>754
all right, I will use AA that's not for short.

759 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:54:34 ]
>>757
> いつものアホ
アホとか言っちゃってるよぉ〜〜〜、お前がアホのくせして初心者に大嘘教えているくせにw
お前みたいな奴にアホ言われたくね〜〜なぁ。俺は間違ってねーし。お前は不適切。

760 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:56:01 ]
VIPPER の AA 略 < 常識的に考えて、文法的におkってことを持ち出して
不十分な(というか間違っている)説明の言い訳をするかぁ?
んじゃお前は a[10] の配列の10番目を参照するときは a[10] とでもやってろよ

761 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:56:21 ]
>>751
それはダメ。
配列変数の宣言文には変数は使えない。
それをするなら

nt i;
char a[]="abc";
char *b;
i=strlen(a);
b=(char*)malloc(sizeof(char)*i);



762 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:56:51 ]
>>751
int i;
char a[]="abc";
char *b;
i=strlen(a);
b = (char*)malloc(sizeof(char)*i);

free(b);

スレの流れからすればこんな感じ
bにaと同じ長さの文字列を入れるなら+1しないと駄目だけど。

763 名前:732 ◆L/nntMgEC6 [2007/07/06(金) 02:58:25 ]
>>761さん
有難う御座います。おかげで疑問が解けました。

764 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:00:43 ]
 |    ( ●)(●)   いい加減な説明をしていることを指摘されて
. |     (__人__)   指摘した相手をアホとか言う方がアホだろ
  |     ` ⌒´ノ   常識的に考えて・・・

765 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:01:22 ]
>>761
C99ならできるというのは禁句かい?

766 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:03:23 ]
回答者が書く補足としては、ありだとおもう。
突っ込みとしては、ちょっと弱い。

767 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:04:15 ]
 / ノ  ⌒ \  文法的にも間違っていることを言う奴が
 |  (●)(●) |  間違っていない奴にアホって言うアホだろ
. |  (__人__)  | 常識的に考えて。ちゃんとキャストしろよ

768 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:05:15 ]
常考常考うるせーよ

貶し合ってないで意味のある話をしろ

769 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:08:42 ]
>>763
VBだとそれができるんだよね。

それはVBなどのインタープリター言語は実行時に変数宣言文も実行文もおなじように上から処理してゆくから。

Cのようなコンパイラ言語はコンパイル時に変数宣言文を処理してゆく。
だからコンパイル時に配列変数のサイズがわかっていないと処理ができない。

JavaもVBと同じだと思う。

770 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:09:22 ]
ここは初心者が鼻息を荒くして入門書読みながらレスしてるのが多くて注意が必要

771 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:09:45 ]
>>765
C99ならできるの?



772 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:10:54 ]
 |    ( ●)(●)   お前みたいな奴は、たとえドラマの役者として
. |     (__人__)   起用されても、まともなキャスティングもされずに
  |     ` ⌒´ノ   脇役かエキストラに決まってんじゃん>アホ言うたアホ

773 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:12:15 ]
AA厨も早く寝ろ
今日はお開きだ

774 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:15:42 ]
>>773 (・∀・)キャスキャス

775 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:17:05 ]
いまさらやらない夫のAA貼り付けて喜んでんのかよw

776 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:27:41 ]
>>771
余裕

777 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:27:46 ]
いまさら やらない か?っつか、いまさらキャストも適切に出来ない奴が
初心者相手にいい加減な説明、笑えねぇ〜〜〜〜〜。お前、指導者に向いてねーよ。

778 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 04:13:51 ]
キャストすると型によってアドレスが変わるプロセッサの話をすると、へんなのを召喚しちゃいますか?

779 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 04:41:39 ]
それがどうかしたのか?
printf に渡すときの話とはわけが違うぞ?

780 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 06:14:06 ]
1バイト文字と2バイト文字が混在してる文字列を
ループ使って1バイトずつputchar()で画面に表示しても
ちゃんとどちらも表示されるのは、シェルやプロンプトの方で
何バイト文字か確認して1バイト文字じゃない時は
一度バッファに溜める、とかしてるからですか?

781 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 06:21:01 ]
ものによるとしか



782 名前:780 mailto:sage [2007/07/06(金) 06:49:14 ]
>>781
例えばどうやって処理してるんですか?

783 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 07:35:00 ]
>>780
いいえ、シェルプログラムはそんなことはしません。

784 名前:780 mailto:sage [2007/07/06(金) 07:52:43 ]
>>783
あ、コンパイラがやってくれてるんですか?

785 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 08:09:19 ]
>>784
いいえ、勿論コンパイラの知ったこっちゃありません。

もしかしたら、画面表示はシェルプログラムがやっていると思っているんですか?
例えば他のPCにリモートログインしたときには相手先のシェルプログラムが動くわけですが、
そのシェルプログラムが自分の使っているPCの画面を直接アクセスするなんて夢でも見ているんですか?

786 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 08:23:14 ]
>>780
マルチバイト文字などに関係なく、標準入出力は
行単位バッファリングされていることが多い。

バッファリングなしにしても、まあ正しいマルチバイト文字列になった時点で
正しく表示されると仮定していいと思う。

787 名前:780 mailto:sage [2007/07/06(金) 08:24:22 ]
>>785
ということはOSの画面表示を担当するプログラムが
putchar()で2バイト文字の一部を出力しようとした時に
2バイト文字の一部だと判断し表示を一時中断して
次に送られてくるputcharの引数と組み合わせて
それに対応する2バイト文字を出力していているんでしょうか?

788 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 08:26:31 ]
2バイト文字で、1バイト目単体で文字としてなりたっているようなのってなんかあったっけ?

789 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 08:28:46 ]
>>788
iso-2022-jpの1バイト目はASCII文字と同じコード。

790 名前:780 mailto:sage [2007/07/06(金) 08:30:47 ]
>>786
行単位でバッファリングするんですね
それで予め2バイト文字があるかないか調べるわけですか、なるほど

791 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 08:39:37 ]
>>789
Shift_JISしか考えてなかった。参考になった
ありがとう



792 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 08:41:44 ]
文字コードの体系もしっかり管理しときゃ良い。

793 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 09:11:21 ]
型で区別するんじゃない?
char型ならその分のデータを受け取るまで待つ

794 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 09:18:02 ]
ASCIIコード体系でなければ左へ受け流すぅ〜

795 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 11:50:43 ]
1: 3.2 2.6 3.4 2.1 5.2 3.4 5.2
2.4 4.2 4.1 0.2 4.2 5.3

2: 3.2 2.4 3.4 2.2 5.2 3.4 5.2
2.4 4.2 4.3 0.2 4.2 5.3

3: 3.1 2.6 3.4 2.1 6.2 3.4 5.2
2.4 4.2 4.0 0.2 4.2 5.3

っていうデータがあるとして
10個目(つまり4.3 4.1 ,4.0)だけを抜き出すプログラムをつくれといわれると
float型でやりますか?char型でやりますか?

796 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 12:26:17 ]
「作れ」っつった本人に仕様を確認する。

797 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 13:03:17 ]
とりあえず float は使わない。
使うなら double 。

798 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 13:51:36 ]
つーか、計算もしないし区切りもはっきりしてるなら
文字列のままで通しちゃったほうがいいべ

799 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 14:01:23 ]
>>793
それはない。そんなことしたら、ファイルにリダイレクトできない。

>>791
iso-2022-jpの場合、KanjiInが来た後は2バイト文字、そうでなければAsciiという分け方。
だから2バイト文字の後にKanjiOutが来ないと文字化けする。

>>790
バッファリングはするかもしれないが、出力の判断とは直接的には無縁。
でなければエスケープシーケンスでの制御ができない。

800 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 15:41:47 ]
>>799
>KanjiInが来た後は
>KanjiOutが来ないと
そんなコード/シーケンスはありません。

801 名前:デフォルトの名無しさん [2007/07/06(金) 18:09:25 ]
Windows2000で作られたソフトはWindowsXPではうまく動作しないことが
あるのですか。LSI C-86を使ってC言語を学ぶという趣旨の本を5年前に
買ったのを今になって勉強しようとしてインストールしたという次第です。
最初のコマンドプロンプトがC:\>になるはずのところ、C:Documents and
Settings□□>となりエラーと表示されました。□□は、再起動時に
アカウント指定を要求され、自分の名前を入れたものです。
別な場所へインストールすればよいのですか。よろしくお願いします。



802 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 18:15:05 ]
>>801
LSI-C86は遺物なので、特殊性を理解できていないなら使ってはいけない。
MSのVisualStudioでもgccでも、無料で手に入るほかのコンパイラを使うことをお勧めする。

803 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 18:18:59 ]
まあコマンドプロンプトをC:\>にしたいなら、cd \ でいいけどな。
本と同じになるだけで、役には立たないだろうけど。

804 名前:デフォルトの名無しさん [2007/07/06(金) 18:26:59 ]
>802 responseありがとうございます。早速入手しようと思います。

805 名前:デフォルトの名無しさん [2007/07/06(金) 18:43:58 ]
ソーカcd¥−enterで続けられるのか。

806 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 18:59:38 ]
>>800 の意図が気になる。

807 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 19:03:18 ]
>>804
たぶん電子メールのレスと2ちゃんのレスは同じ意味を持ってると思うんだが、
だとしたら君が使ってるresponseはレスという意味とは違うぞ

808 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 19:06:00 ]
>>807
ja.wikipedia.org/wiki/%E3%83%AC%E3%82%B9

809 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 19:37:26 ]
nullponceというのを提案しまnce

810 名前:723 mailto:sage [2007/07/06(金) 19:39:17 ]
>>729
忘れてた

811 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 19:43:03 ]
英語版ウィキペには

Reply. Its abbreviation followed by colon (Re:) is prepended to e-mail subject lines when answering a received message

って書いてるんだよな。
まあ、スレ違いだからどうでもいいが。



812 名前:デフォルトの名無しさん [2007/07/06(金) 20:22:37 ]
A)入力装置に関する記述のうち,適切なものはどれか。
1 ジョイスティックは,画面上に透明なセンサを取り付けたものであり,画面に指などを押し付けて座標を指示する。
2 タブレットは,ペンのような装置と板状の装置を組み合わせた入力機器であり,ペンのような装置を押し付けて座標を指示する。
3 ディジタイザは,人間のもつ静電気を利用して指の位置を検出するポインティングデバイスであり,操作面を指して座標を指示する。
4 トラックパッドは,球の一部分が装置の上面に出ているポインティングデバイスであり,球を指で直接回転させて,その変化量で座標を指示する。

すみません、質問なのですが今上の問題がハードウエアの組み込みの
参考書の問題がわかりませんので、教えてはいただけないでしょうか?

813 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:25:09 ]
>>812
2

814 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:26:34 ]

1はジョイスティックの説明ではない事は明らかだから×
2は正しいと思うから○
3は知らんから知らん
4はトラックパッドじゃなくてトラックボールの説明だから×

815 名前:デフォルトの名無しさん [2007/07/06(金) 20:29:48 ]
ありがとうございました。

これで先に行けます。

816 名前:デフォルトの名無しさん [2007/07/06(金) 20:32:06 ]
制御系といえば、C言語だけど
Cのすごい所って何?

817 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:38:01 ]
体にぴったり張り付くスク水の用に、ハードウェアに貼り付ける所

818 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:38:40 ]
>>816
おまえの方がすごいと思う。

819 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:38:58 ]
3はタッチセンサとか、タッチスクリーンとか言われている物のうちの1種だね

820 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:41:36 ]
>>812
3の説明がトラックパッドっぽいな

821 名前:デフォルトの名無しさん [2007/07/06(金) 20:42:36 ]
C言語にできることは、C++にもできるって聞いたんだけど、
C++も体にぴったり張り付くスク水のように、
ハードウェアに貼りつけるの??



822 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:43:22 ]
Cと同じようにできる。

823 名前:デフォルトの名無しさん [2007/07/06(金) 20:44:46 ]
C++もC言語と同じように最強ならば、
C++も制御系によく使われるの?
それともC++はオープン系(WEB系も含む)?

824 名前:デフォルトの名無しさん [2007/07/06(金) 20:47:10 ]
質問です。年月日を入力してツェラーの公式を利用して曜日を表示するプログラム
をつくりたいんですけど、BCCでコンパイルしたら公式のところでエラー
「浮動小数点の不正な使用」ってでるんですけど、どうしてだかわかりますかね?
#include <stdio.h>

int main(void){
int year,month,day;
char youbi[7][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int i;

printf("Year?");
scanf("%d",&year);
printf("Month?");
scanf("%d",&month);
printf("Day?");
scanf("%d",&day);

i=(year + (year/4) - (year/100) + (year/400) + (2.6*month +1.6) + day)%7;
printf("It's %s.",youbi[i]);
return 0;
}

825 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:49:26 ]
>>821
C++の場合スク水フェチのオジサンが自分で着る用に作ったものもあるので注意

826 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:56:27 ]
>>824
(2.6*month +1.6)を(int)(2.6*month +1.6)にしろ。
ここが整数でないから、%の左側全体が整数型でなくなっている。
剰余演算子は浮動小数点数を演算対象にできないので、件のエラーになる。

827 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:57:13 ]
>>823
Cが制御系で使われるのは「最強」だからではなく「高級アセンブラ」だから。
C++も制御系で使われるよ。C++として使われるかはともかく。

つか、最強ってなんだよ。

828 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:58:38 ]
>>824
剰余演算子%というオペランドは整数同士でないとダメ

演算してる行の型がごっちゃになってるから明示的にキャストしたり読みやすくすべき
基本的にコメント文とかで説明もなしに実数を整数に叩き込んだりしちゃだめ

829 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 21:19:14 ]
なるほど。できました、ありがとうございます。

830 名前:デフォルトの名無しさん [2007/07/06(金) 21:30:26 ]
スレ違いかもだけど、ここの人達他のスレより頼りになりそうなので。。。
基本情報の午後問をCで受かりたいのですが、なんの本を読めばいいですか?
当方、C言語はよくわかりません。COBOLは少しできます。
ただCで受けたいのです。

831 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 21:32:10 ]
>>830
試験は慣れたものでやるべき



832 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 21:58:20 ]
>>830
アセンブラがオススメ
例年一番簡単

833 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 21:59:06 ]
C言語ってeclipceかbolandか、
それともvisual basic かどれでやればいいですか?

834 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:04:13 ]
その質問おもしろい?

835 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:10:25 ]
visual studioだっけ?

836 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:12:46 ]
>>833
Linuxでもできるよ。

837 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:14:19 ]
整数型配列は
int iarray[10];
memset(iarray, 0, sizeof(array));
ですべて0で初期化できると知ったのですが、

実数型配列を
double darray[10];
memset(darray, 0.0, sizeof(array));
のように初期化してもかまいませんか?
つまり実数型配列の全ての要素を0.0にしたいのです

838 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:16:31 ]
>>837
いいんじゃね?
DirectXとか、そういう方法で、実数やらポインタやらバリバリクリアしてたな。
移植性は無くなる。

839 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:17:55 ]
> memset(darray, 0.0, sizeof(array)); 

あ、これは、警告かエラーになるな。
sizeof のところはミスだよね?


840 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:19:54 ]
>>837
ANSI/ISO Cへの移植性を望むなら避けるべき。
浮動小数点数がIEEE 754に則っていることを仮定してよいなら構わない。

841 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:21:17 ]
>>833
ほとんどにアルゴリズムの問題
ポケコンのCインタプリタでおk



842 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:26:29 ]
>>839
あと、0.0 は 0 だな。

843 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:27:49 ]
>>839
すみません sizeof(darray) です
あとmanページでmenset関数を調べてみると
#include <string.h>
void *memset(void *buf, int ch, size_t n);
となっていたので
int ch に0.0と渡してもだめなんですね

ということは関数の仕様上は
memset(darray, 0, sizeof(darray));
と書くのが正しくて、
しかもCコンパイラの浮動小数点がIEEE754前提での使い方なので

結局は配列の要素数の分だけループで回して初期化するのが
一番いちゃもん言われにくいということでよろしいでしょうか?
ありがとうございました

844 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:29:23 ]
エクセス64で 0 ってどうなるの?






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<185KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef