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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/12/15(火) 23:42:55
C言語の*入門者*向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門編)Part 57
http://pc12.2ch.net/test/read.cgi/tech/1260020924/
★過去スレ
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++室 Ver.70【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1258873470/
とか
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 133代目
http://pc12.2ch.net/test/read.cgi/tech/1260532772/
★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0153デフォルトの名無しさん2009/12/17(木) 00:35:25
実は、この5つすべて(Python, Java, C/C++, Perl, LISP)を勉強しておくのがいちばんいいのです。

これらはもっとも重要なハッキング用言語だというだけでなく、

それぞれプログラミングに対してまったく違ったアプローチをしているので、どれも非常に有益な勉強となるでしょう。
0154厨房 ◆hfigpiEhOM 2009/12/17(木) 00:43:26
>>152
アセンブリとか難しそうですね。
せめて自分でチートコード作れるくらいになりたいです。
まったくの初心者ですか今後ともよろしくお願いします。
ちなみに以前C言語も学習していましたが、ポインタで投げました。
また1からやり直したいと思います。
0155デフォルトの名無しさん2009/12/17(木) 00:45:31
これ試してみろ。違いが解るから。

#include <stdio.h>

char glob[]="HOGE";

void func(int n){
static char sta[]="HOGE";
char aut[]="HOGE";

printf("d%回目\n", n);
printf("global: %s\n", glob);
printf("static: %s\n", sta);
printf("auto: %s\n", aut);

glob[1] = 'A';
sta[1] = 'A';
aut[1] = 'A';
}

int main(){
func(1);
func(2);
return 0;
}
0156デフォルトの名無しさん2009/12/17(木) 00:49:25
>>153
C++ は要らねえな。
0157デフォルトの名無しさん2009/12/17(木) 01:01:57
Cに固執するアンチC++の哀れなこと
0158デフォルトの名無しさん2009/12/17(木) 01:08:00
条件によって変数の型を変えるプログラムって無理?
例えば
int a;
scanf("%d", &a);
switch (a)
{
  case 1:
    int b;
    break;

  case 2:
    double b;
    break;

  case 3:
    char b;
    break;
}

こんな感じで。
0159デフォルトの名無しさん2009/12/17(木) 01:11:23
C++のポジションはすでにレガシーとなっているよ。
普及してるが、FORTRAN、COBOLと同じ道を歩み始めている。
0160デフォルトの名無しさん2009/12/17(木) 01:14:26
int a;
scanf("%d", &a);
viod b;
switch (a)
{
  case 1:
    int c=(int)b;
    break;

  case 2:
    double c=(double)b;
    break;

  case 3:
    char c=(char)b;
    break;
}
0161デフォルトの名無しさん2009/12/17(木) 01:29:59
>>158
通常は、必要に応じてキャストすればいい。
つか、どうしたいんだ?
0162デフォルトの名無しさん2009/12/17(木) 01:49:45
>>158
無理。
たとえば、Windows の COM なら VARIANT型を使えば、なんとなくそれっぽいことができるが、入門レベルではない。
0163デフォルトの名無しさん2009/12/17(木) 01:57:19
目的にもよるんだが、「共用体」を調べてみるといい。
つか、その質問だけでは何がしたいのかが伝わってこないから答えられん。
0164デフォルトの名無しさん2009/12/17(木) 02:23:46
ユーザ関数に引数を渡す際に型を指定せずに処理がしたいんです。具体的には

ここをintでもcharでもいけるにしたい
        ↓
void function(double *v1)
{
  int i;
  for(i=0;i<10;i++)
  {
    //型の関係のない数値計算
    P[i]=〜
  }
}
ていうことです。
0165デフォルトの名無しさん2009/12/17(木) 02:24:31
んでいろいろ考えた結果
ユーザ関数ではとりあえずvoid*型でポインタを引数を受け取って、引数の中に型のタイプの情報(上のscanfのa)
を入れて、それに応じてキャストすればいけるかなと思ったわけです。

void function(void *v1,char a)
{
  int i;
  switch(a)
  {
  case 1:
    int *P;
    P=(int*)v1;
    break;

  case 2:
    double *P;
    P=(double*)v1;
    break;

  case 3:
    char *P;
    P=(char*)v1;
    break;
  }
  
  for(i=0;i<10;i++)
  {
    //型の関係のない数値計算
    P[i]=〜
  }
}
0166デフォルトの名無しさん2009/12/17(木) 02:38:04
ありえないな。
設計からやり直した方がいいよ。
0167デフォルトの名無しさん2009/12/17(木) 03:00:09
struct DATA
{
  int iheight;
  int iweight;
}

この様に定義された構造体データ(idataNum件)を
身長順にダブルポインタを使ってソートをかけたいのですが、
そのダブルポインタのスワップ処理が分からず困っています・・・。

void swap( DATA** stData_ptr, int idataNum)
{
  DATA* stSwap;
  for( int i = 0; i < idataNum-1; i++ )
  {
    for( int n = i + 1; n < idataNum; n++ )
    {
      if( (*stData_ptr + i )->iheight > (*stData_ptr + n )->iheight )
      {
        stSwap = ( *stData_ptr + i );
        ( *stData_ptr + i ) = ( *stData_ptr + n ) ;
        ( *stData_ptr + n ) = stSwap ;
      }
    }
  }
}

てな感じで自分なりに試行錯誤してみたのですが、どうしてもスワップ部でエラーが出てしまいます。
どうか、お力をお貸しして頂けないでしょうか?
0168デフォルトの名無しさん2009/12/17(木) 03:02:53
*(ポインタ+i)
0169デフォルトの名無しさん2009/12/17(木) 03:16:59
p[i]って書けばいいものをわざわざ足し算したりするからわけわからなくなってるっつーねん。
なんで変な書き方したがるかなぁ?
0170デフォルトの名無しさん2009/12/17(木) 03:19:54
え?
0171デフォルトの名無しさん2009/12/17(木) 03:28:48
>>168
ありがとうございます。

stSwap = *(stMyData+i);
*(stMyData+i) = *(stMyData+n);
*(stMyData+n) = stSwap;

このようにやってみたところ、一応コンパイルは通るのですが、
実行させてみるとメモリー違反っとなってしまいます・・・。

>>168
ごめんなさい。その書き方もあまり分からないので・・・・
0172デフォルトの名無しさん2009/12/17(木) 04:59:27
ありとあらゆるものをキャストする
この世の事実はすべてint型。
つまりint*型とint[]型とint型さえ使うことができればあらゆるプログラムの困難は解決する。
0173デフォルトの名無しさん2009/12/17(木) 05:01:07
>>164
マクロで無理矢理やるというおよそ非実用的な手段がある。
#define DEFINE_FUNCTION(type) \
void function_ ## type(type *v1) \
{ \
  int i; \
  for(i=0;i<10;i++) \
  { \
    P[i]=〜 \
  } \
}
そして、こんな風に引数として使いたい型だけマクロを並べる。
DEFINE_FUNCTION(int)
DEFINE_FUNCTION(dobule)
すると、それぞれ型に応じたfunction_int、funciton_doubleって関数が出来上がる。

こんなことするくらいだったら、C++のテンプレートを使ったほうがましなんだけど、ここはCのスレだし。
0174デフォルトの名無しさん2009/12/17(木) 05:02:23
テンプレートとかただのアヒルタイプだし。マジうける。
そんなものもint*型の前にはひれふすことになる。
0175デフォルトの名無しさん2009/12/17(木) 07:32:49
>>165
そういうときは、union使うといい

struct hoge {
 int data_type;  // 0:int 1:char 2:double ...
  union {
       char  c;
       int    i;
       double d;
    ...
  } u;
};
0176デフォルトの名無しさん2009/12/17(木) 07:39:33
>>175
いやその解は有りえんから
0177デフォルトの名無しさん2009/12/17(木) 11:26:16
void function(void *v1,char a)
{
  int i;
  for(i=0;i<10;i++)
  {
    //型に応じた数値計算
    switch(a)
    {
    case 1:
      //((int*)v1)[i];
      break;
    case 2:
      //((double*)v1)[i];
      break;
    case 3:
      //((char*)v1)[i];
      break;
    }
  }
}

こうはできないものかと妄想したが
0178デフォルトの名無しさん2009/12/17(木) 12:59:18
目的がわからんのだよ。
そんなのが必要になる状況なんてありえないだろ。
0179デフォルトの名無しさん2009/12/17(木) 13:20:43
型を別の引数で指定するくらいなら関数を分けるのが最善手。
そうでなけりゃ C++ で template 使え。
0180デフォルトの名無しさん2009/12/17(木) 14:05:17
template利用する場合でも数値を扱うなら実数と整数では別けて特殊化するがね
0181デフォルトの名無しさん2009/12/17(木) 14:48:26
漢字やひらがなでソートしたいのですが可能なのでしょうか
もしできるのなら詳しくソースコードを教えてください
0182デフォルトの名無しさん2009/12/17(木) 14:49:25
文字コードそのままでソートしてるんじゃねえの
0183デフォルトの名無しさん2009/12/17(木) 14:50:07
辞書データと比較してだな
0184デフォルトの名無しさん2009/12/17(木) 15:04:33
並べたい順に並べるだけだな。
0185デフォルトの名無しさん2009/12/17(木) 15:11:03
kwsk
0186デフォルトの名無しさん2009/12/17(木) 15:14:02
住所録ソフトとか見たことないの?
漢字使ってる場合とかは読みを別に入力して、その読みの順でソートするんだよ?
読みはローマ字表記のものもあればかな表記のものあるけど
どちらにせよその後は普通のソートだよ
0187デフォルトの名無しさん2009/12/17(木) 15:53:48
漢字に順番なんてものは無いんだから、
比較して自分が並べたい順に並べるしかないだろ。
「太郎」と「次郎」はどっちが先だ?
0188デフォルトの名無しさん2009/12/17(木) 15:57:48
あいうえお順なら、次郎が先、逆順なら太郎
文字コード順なら太郎が咲き
0189デフォルトの名無しさん2009/12/17(木) 16:02:37
DQNネームが流行ってる今、あいうえお順なんてふりがながふってないとムリ
0190デフォルトの名無しさん2009/12/17(木) 16:07:14
太郎と書いて「ジャスティス」と読ませたり
次郎と書いて「つぐろう」と読ませたり
出生届けの読みが自由ってどうなんだろうな
0191デフォルトの名無しさん2009/12/17(木) 16:14:43
>>190
読み仮名を登録しないだけかんだから「読ませ方」も自由なら「読み方」も自由
自分の好きな読み方で処理すれば良い
0192デフォルトの名無しさん2009/12/17(木) 16:15:29
>>190
読みは登録しないだろ
0193デフォルトの名無しさん2009/12/17(木) 16:16:26
それでも客は無茶を言う
0194デフォルトの名無しさん2009/12/17(木) 16:18:22
OPをEDより先にしたいとか、前編より後編を先にしたい場合に
読み以外の何で整列させればいいんだろ
0195デフォルトの名無しさん2009/12/17(木) 16:19:39
× 前編より後編を先にしたい場合に
○ 前編を後編より先にしたい場合に
0196デフォルトの名無しさん2009/12/17(木) 16:21:05
>>194
正規表現
ハードコーディングで頑張れ
0197デフォルトの名無しさん2009/12/17(木) 16:24:26
>>196
正規表現はCで使えたっけ?
0198デフォルトの名無しさん2009/12/17(木) 16:29:36
>>193
「この顧客リストを強い順にソートしてくれ」
0199デフォルトの名無しさん2009/12/17(木) 16:39:49
「グー・チョキ・パーを強い順番にソートしてくれ」
0200デフォルトの名無しさん2009/12/17(木) 18:12:33
テキストファイルの中身を文字コードで出力する方法ないでしょうか?
0201デフォルトの名無しさん2009/12/17(木) 18:14:30
16進ダンプ?
0202デフォルトの名無しさん2009/12/17(木) 18:17:05
>>201
ん〜000000とかの付属情報なしに純粋に文字コードだけ抜き出したいです。
0203デフォルトの名無しさん2009/12/17(木) 18:19:31
文字コードって言ってることがわからないんだけど
0204デフォルトの名無しさん2009/12/17(木) 18:25:04
テキストファイルの中身がunicodeで”あいうえお”と書かれていたら
”3042304430463048304a”と書き出されるイメージです。
0205デフォルトの名無しさん2009/12/17(木) 18:31:57


意外と難しいのがセンタリング
フィールドの大きさをまず測る

一文字だけなら、その中心部分、半分に割った位置にフォントの中心部分を置けばいいが
文字数が増えたときのオフセットの取り方が意外とパッと出てこないもの。

普通にやると
「堀 川 掘 ら れ た 町」
にならず、
「堀川掘      られた町」

みたいになってしまう
0206デフォルトの名無しさん2009/12/17(木) 18:33:34
16進ダンプを基本にして目的のものを書けばいいだけじゃ
0207デフォルトの名無しさん2009/12/17(木) 18:34:50
         ,. ‐''三ヾ´彡シ,=`丶、ヾ´彡シ,=`丶、シ,=`丶、,=`丶、丶、
      /'".:=≡ミ_≧_尨彡三:ヽ、≧_尨彡三:ヽ、彡三:ヽ、三:ヽ、:ヽ、
     //.:;:彡:f'"´‐------ ``'r=:l------ ``'r=:l-- ``'r=:l ``'r=:l 'r=:l
     /〃彡_彡′,.=、 ̄ ̄ ,.=、 |ミ:〉 ̄ ̄,.=、 |ミ:〉,.=、 |ミ:〉、 |ミ:〉|ミ:〉
    'y=、、:f´===tr==、.___,. ==、._ゞ{=、.___,. ==、._ゞ{,. ==、._ゞ{==、._ゞ{._ゞ{
    {´yヘl'′   |   /⌒l′  |`Y} /⌒l′  |`Y}′  |`Y}  |`Y}|`Y}   ああきあきらあきらめあきらめた
    ゙、ゝ)       `''''ツ_  _;`ー‐'゙:::::l{ノ_ _;`ー‐'゙:::::l{_;`ー‐'゙:::::l{‐'゙:::::l{゙:::::l{     そそこそこでそこで試そこで試合
.    ヽ.__     ,ィnmmm、   .:::|!mmm、   .::|!m、   .::|!   .::|! .::|!
   ,.ィ'´ト.´     ´`"`"`゙″ .::::;'`"`"`゙″ .:::;'`゙″ .:::;'″ .:::;' .:::;'
イ´::ノ|::::l \         "'   :::/   "'   :::/'    :::/   :::/ :::/
::::::::::::|:::::l   ヽ、      ..::  .:::/.、   ..:: .:::/.、 ..:: .:::/.、: .:::/.、::/.、
:::::: ::: |:::::ヽ    ヽ、.......::::/..:::/!\\:/..:::/!\\::/!\\ !\\ \
::::::::::: |::::::::ヽ    ``''‐--ァt''′ |!:::ヽ:::\t''′ |!:::ヽ:::\|!:::ヽ:::\:::ヽ:::\:\
:::::::::::::|::::::::::::ヽ、       /i|iト、  |l:::::::ヽ:::::\  |l:::::::ヽ:::::\::::ヽ:::::\:ヽ:::::\:\
:::::::::::::|::::::::::::::/:ヽ、   ∧|i|i|i|〉. ||::::::::::ヽ:::::::\||::::::::::ヽ:::::::\:::ヽ:::::::\ヽ::::::\:\
0208デフォルトの名無しさん2009/12/17(木) 18:47:02
改行はどうするんだろ。
0209デフォルトの名無しさん2009/12/17(木) 18:47:23
>>206
16進ダンプのことあまり理解してなかったみたいなので出直してきます
0210デフォルトの名無しさん2009/12/17(木) 19:38:54
それでいい
0211デフォルトの名無しさん2009/12/17(木) 19:40:49
>>199
      パ
     / | \
   チ  |  グ
  /    チ    \
グ     |     チ
| \    |    / |
|  チ  グ  グ  |
パ    \  /    グ
|  パ  パ  チ  |
| /    |    \ |
チ     |     パ
  \    チ    /
   パ  |  チ
     \ | /
      グ
0212デフォルトの名無しさん2009/12/17(木) 19:56:20
これはひどい
0213デフォルトの名無しさん2009/12/17(木) 21:01:16
>>211
天才現る!
と思ったら、ソートできてねぇ!w
0214デフォルトの名無しさん2009/12/17(木) 21:21:28
あらら
0215デフォルトの名無しさん2009/12/17(木) 23:56:41
>>211
まず配置のルールがわからない
発想はともかくもっと根本的な部分を調整しろよ
0216デフォルトの名無しさん2009/12/18(金) 00:08:46
>>211
ふっ
0217デフォルトの名無しさん2009/12/18(金) 00:39:29
ポインタって、バグがあるのに正常にうごくことがあるから厄介なのかね。

int *p;
{
int x;
p=&x;
}

p[1]=500;
こんなのでも正常にうごいてる(ようにみえる)かもしれないし。
0218デフォルトの名無しさん2009/12/18(金) 00:46:00
>176

>175の方法は普通によくやる。
ていうか>165を見てはじめに思いつくのはこれ。

>178
共用体は、引数に汎用性を持たせたいフレームワーク、メッセージインターフェイス
とかでよく利用する。

後はジャンプテーブルを使うために、関数のプロトタイプ宣言をそろえたいけど、
引数はいろいろあり得るような場合は、引数をvoid*にしたり共用体で渡したりする。

>179
関数のプロトタイプ宣言をそろえるのがミソなので、templateは使えない。
0219デフォルトの名無しさん2009/12/18(金) 00:48:53
>217

そうだね。不具合が発生するのが、全然別の場所、タイミングだったりするのが
やっかいだよね。
0220デフォルトの名無しさん2009/12/18(金) 06:06:03
>>219
たしかにやっかいだよね。
0221デフォルトの名無しさん2009/12/18(金) 09:22:03
>>218
これだけ勘違いカキコする奴もメヅラシイな
普段何やってんだろ??
0222デフォルトの名無しさん2009/12/18(金) 09:25:04
>>218 は別におかしくないぞ
0223デフォルトの名無しさん2009/12/18(金) 09:31:21
俺も>>218はフツーのことを言ってるだけに見える。
別におかしくは無い。
0224デフォルトの名無しさん2009/12/18(金) 10:05:26
>>218
おかしくないと思う
0225デフォルトの名無しさん2009/12/18(金) 10:40:09
>>222-224
最後の行は何か勘違いしているように思えてならないが、
まあスレ違いだしどうでもいいや。
0226デフォルトの名無しさん2009/12/18(金) 10:50:42
可変で関数ってのがあったはず、、、と思って調べてみたら見つかった
va_start
自分は使ったことないけど、これじゃダメなの?
ttp://wisdom.sakura.ne.jp/programming/c/c62.html
>printf()関数などは、フォーマット指定子によって引数リストの個数と型をチェックしていますね
と同じように型チェックしてから、、とか
0227デフォルトの名無しさん2009/12/18(金) 11:42:01
ようは、VBでいうVariant型を作りたいのか?
0228デフォルトの名無しさん2009/12/18(金) 11:42:44
かなりダメな気がしてきた、、、
0229デフォルトの名無しさん2009/12/18(金) 11:44:38
C++ならboost::anyが使えるんだけどな
0230デフォルトの名無しさん2009/12/18(金) 11:49:19
>>226
結局、何らかの形で型を示す引数を一緒に渡すわけで
>>165 から何も変わっていない。
0231デフォルトの名無しさん2009/12/18(金) 11:53:27
変わっていないな。
0232デフォルトの名無しさん2009/12/18(金) 12:51:39
なんだよこのグダグダ
0233デフォルトの名無しさん2009/12/18(金) 12:54:29
え?ディグダグ?
0234デフォルトの名無しさん2009/12/18(金) 17:06:34
判ってない奴が頑張りカキコ
判ってる奴は奴では一行レスのチャチャ入れるだけだからグダグダになるのは仕方がない
0235デフォルトの名無しさん2009/12/18(金) 17:37:08
それじゃできない。だけど、なにがしたいか分からんので、茶々入れるしかない。
0236デフォルトの名無しさん2009/12/18(金) 19:25:04
>>235
> なにがしたいか分からんので、茶々入れるしかない。
もう一度 冷静に自分の言っていることを検証したまえ。
0237デフォルトの名無しさん2009/12/18(金) 19:43:03
お、おれは分かってるよ。

キャッチコピーは「戦略的穴掘りゲーム」だろ?
0238デフォルトの名無しさん2009/12/18(金) 19:50:19
ほとんど全てのレスに対して間違い探しゲームが成立してしまうのがこのスレッドの凄いところ
0239デフォルトの名無しさん2009/12/18(金) 20:02:52
ライアーゲームは情報弱者には辛かろうな
0240デフォルトの名無しさん2009/12/18(金) 22:49:36
::

よくバイソンとかシーインクリメントとかで見るんだけど
なんこれ。
0241デフォルトの名無しさん2009/12/18(金) 23:27:25
>>237
戦略的穴掘りゲームおもしろそう
0242デフォルトの名無しさん2009/12/18(金) 23:29:49
アッー
0243デフォルトの名無しさん2009/12/19(土) 00:05:15
int main(void)
{
int num = 567;

num = num / 10;
num = num % 10;
printf( "%d\n", num );

return 0;
}


これを剰余演算を使わずに書きたいんですが、できますか?
0244デフォルトの名無しさん2009/12/19(土) 00:10:37
dividend = quotient * divisor + remainder
remainder = dividend - quotient * divisor
0245デフォルトの名無しさん2009/12/19(土) 00:13:09
num % 10
を
num - (num / 10) * 10
にする。
0246デフォルトの名無しさん2009/12/19(土) 00:19:58
>>243
int num = 6:
0247デフォルトの名無しさん2009/12/19(土) 00:20:34
以上です。
0248デフォルトの名無しさん2009/12/19(土) 00:24:55
>>247
itoaを使う方法考えてたのに〜
0249デフォルトの名無しさん2009/12/19(土) 00:26:13
That's all.
0250デフォルトの名無しさん2009/12/19(土) 00:30:20
>>248
すまんな…
0251デフォルトの名無しさん2009/12/19(土) 07:11:41
>240

シーインクリメントとは斬新な呼び方だね。
けどなぜCスレで聞く?

もしかしてスルーが正解だったか?戦略的穴掘りに落ちちゃった?
0252デフォルトの名無しさん2009/12/19(土) 08:42:08
fread()とfwrite()の意味を教えてください!
■ このスレッドは過去ログ倉庫に格納されています