C言語なら俺に聞け( ..
[2ch|▼Menu]
151:デフォルトの名無しさん
10/04/15 17:34:28
>>148
CとFORTRANで配列データを受け渡しをするんであれば、
その違い留意する必要があるけど、そうでないのであれば問題ないはず。

FORTRAN にしてもCの方法では初期化できないよ。
君が何を問題にしているのかがよくわからんよ。

C言語は配列の配列なので、添字の順番は今のでないと成り立たない。
BASICやFORTRANは純粋に多次元配列なので、C言語の順でもよかったんだけど、
最初にそう決めたんだから、今更変わることもないだろう。

152:デフォルトの名無しさん
10/04/15 17:53:40
1 #include <stdio.h>
2
3 int main(void)
4 {
5
6 printf("%s\n", NULL);
7
8 return 0;
9 }

このプログラムがセグメンテーションエラーになるんですけどなぜでしょうか

153:デフォルトの名無しさん
10/04/15 17:55:43
>>152
メモリの0番地をリードしようとするから

154:デフォルトの名無しさん
10/04/15 17:55:47
プログラミングはじめたいんだけどなにDLしたらいいの?
やりたいのはCです。

155:デフォルトの名無しさん
10/04/15 17:58:17
最終的に何が作りたいの?

156:デフォルトの名無しさん
10/04/15 17:59:15
>>154
Visual C++ 2008 Express Edition

157:デフォルトの名無しさん
10/04/15 18:00:33
2010が旬だろw

158:デフォルトの名無しさん
10/04/15 18:01:09
VC勧める人よくいるけど、導入やコード作成の手間考えれば
初学者にはちょっと敷居が高いんじゃないか?

159:デフォルトの名無しさん
10/04/15 18:02:57
VC++も最初に落としたけど、 C言語を始めよう! からが初めやすかった
慣れればVC++で良いけど。エディタはサクラエディタに慣れると他のが使いにくくなった

160:デフォルトの名無しさん
10/04/15 18:04:44
>>153
NULLポインタを渡したら(null)みたいに表示されるものと勘違いしていました. 馬鹿でした

161:デフォルトの名無しさん
10/04/15 18:05:11
ありがとう、とりあえず挙がったの落としてみるよサンクス

162:デフォルトの名無しさん
10/04/15 18:38:08
>>157
まだ英語版しかない

163:デフォルトの名無しさん
10/04/15 20:02:52
ソース見てたんですけど
GPIO.F5 = ~GPIO.F5;の「= ~」ってどうゆう意味ですか?
よろしくお願いします

164:デフォルトの名無しさん
10/04/15 20:08:41
=は代入、~はビット反転

165:デフォルトの名無しさん
10/04/15 20:09:17
>>163
~は論理否定の演算子なので、~GPIO.F5はF5ビットを反転した値になる。
それをGPIO.F5へ代入している。
つまり、F5ビットが今の状態から反転するってこと。

166:デフォルトの名無しさん
10/04/15 20:11:20
>>164 >>165
有難うございました

167:デフォルトの名無しさん
10/04/15 20:55:49
>>165
論理否定と言ったら「!」のことを指す
「~」はビット反転とかビット否定とか1の補数とか

168:デフォルトの名無しさん
10/04/15 21:04:30
パターンマッチ演算子のある言語から来るとぎょっとするかもねぇ

169:デフォルトの名無しさん
10/04/15 21:38:48
配列の長さはどうやって求めるのですか?

170:デフォルトの名無しさん
10/04/15 21:46:09
sizeof

171:169
10/04/15 21:47:00
>>170
thx

172:デフォルトの名無しさん
10/04/15 22:04:54
危険な予感

173:デフォルトの名無しさん
10/04/15 22:07:53
sizeof array / sizeof *array で配列の要素数が求められる

174:デフォルトの名無しさん
10/04/15 22:19:04
1になるんですけど・・・と言ってくるのが目に見えるようだ

175:デフォルトの名無しさん
10/04/15 22:19:34
0もありうる

176:デフォルトの名無しさん
10/04/15 22:21:23
mallocしたポインタで、ポインタのサイズが返ってくるに一票

177:デフォルトの名無しさん
10/04/15 22:28:46
2や4もあるで

178:デフォルトの名無しさん
10/04/15 22:34:39
一つづつ数えろよ

179:デフォルトの名無しさん
10/04/16 00:13:52
#define の ## って何ですか?

180:デフォルトの名無しさん
10/04/16 00:16:00
連接

181:デフォルトの名無しさん
10/04/16 00:18:54
連接ってなんだろう・・・

182:デフォルトの名無しさん
10/04/16 00:37:46
#define cat(a, b) a##b

int func1();
int func2();

int main(){
  cat(func, 1)();  // -> func1();
  cat(func, 2)();  // -> func2();
  return 0;
}

183:デフォルトの名無しさん
10/04/16 08:07:21
>>68
「それ以外」というのは main() がint を返さない場合のことですよね。
すなわち main() の型が実装によっていろいろかわることも許容しているではないでしょうか?

184:デフォルトの名無しさん
10/04/16 08:12:22
>>183
main 関数の型を構成する要素(>>73,92参照)のうち、まず戻り値の型は int であるとし、
それ以外の要素について(つまり引数リストの型などについて)は実装依存であるということ。

185:デフォルトの名無しさん
10/04/16 12:31:24
>>182
そうなんだ。
どうもありがとうございます。

では #defineの#は何ですか?

186:デフォルトの名無しさん
10/04/16 13:02:28
学校卒業したけど、就職できなかったんだね。可哀想に。

187:デフォルトの名無しさん
10/04/16 18:50:00
>>185
#defineの#はディレクティブといふ。

C言語のソースファイルのコードはそのままコンパイラに食わせる訳じゃなくて、
プリプロセスという課程を経てプリプロセッサが吐き出したコードをコンパイラに食わせている。
プリプロセッサに命令を与える(認識させる)文字がディレクティブ(#)。
注意しなきゃいけないのは、マクロ中の#と先頭に付いている#は全く別であるということだ。
ディレクティブとしての#は先頭に付いている。

例えば一番簡単な例が
#include"xxxx.h"
#includeはプリプロセッサにxxxx.hっていうヘッダファイルを読み込んで、
それそのものをコピペする

もし君がgccを使用しているならgcc -Eでコンパイルしてみるといい。
プリプロセス済みのソースコードが画面に吐き出されるハズだ。

命令には以下のようなものがある。
#include,#define,#if(#ifdef)+#else+#endif

#ifの条件判定には式を、#ifdefの場合は予め定義の何かを使う場合が多い。

後他に#pragmaってのがあるがこれは俺は使ったことが無いので分からない。

188:デフォルトの名無しさん
10/04/16 18:56:09
#define の右辺に登場する # 側を聞いているような気配
文字リテラル化する奴だな

#define foo(arg) #arg
foo(hogehoge) → "hogehoge"

189:デフォルトの名無しさん
10/04/16 19:01:34
>>187
コード、コンパイラ、プリプロセッサ、ヘンダファイルってなんですか?

ディレクティブってエクスプローラーで見た時のフォルダのことですよね、それはわかります。
でもC言語との関係がわかりません。

gccでなくpcを使ってます、osはもちろんwindowsです。ですから試せません。

すみませんがよろしくお願いします。

190:デフォルトの名無しさん
10/04/16 19:03:21
>>188
ありがとうございます。

191:デフォルトの名無しさん
10/04/16 19:35:28
>>189
     ,.――-、
     ヽ / ̄ ̄ ̄`ヽ、     勇者トンファーパーマン惨状
      | |  (・)。(・)|
      | |@_,.--、_,>       俺が着たからにはもう色々と駄目だ
      ヽヽ___ノ          
        /:::::::::::::::::l   /77
       /::::::::::i:i:::::::i,../ / | 
       l:::/::::::::i:i:::、:::/ / |  
       l;;ノ:::::::::::::::l l;.,.,.!  |  
        /::::::::::::::::l/ /  冂 
       /:::::::;へ:::::::l~   |ヌ|
      /:::::/´  ヽ:::l   .|ヌ|  
      .〔:::::l     l:::l   凵
      ヽ;;;>     \;;>

192:デフォルトの名無しさん
10/04/16 20:06:08
おもしろいネタだこと

193:デフォルトの名無しさん
10/04/16 20:29:35
#include <stdio.h>
int main(void)
{
long i=0;
for (i=1;i>=0xFFFFFFFFFFFFFFF;i++){}
return 0;
}
(8) : error C2143: 構文エラー : ';' が '型' の前にありません。
(9) : error C2065: 'i' : 定義されていない識別子です。
(9) : error C2065: 'i' : 定義されていない識別子です。
(9) : error C2065: 'i' : 定義されていない識別子です。

どこがおかしいのか分かりません
たすけてくだしあ

194:193
10/04/16 20:33:11

(8)は4行目です

195:デフォルトの名無しさん
10/04/16 20:55:01
>>193
普通に動いたよ。
long int じゃないとだめとかかな?


196:デフォルトの名無しさん
10/04/16 20:59:20
>>193
うちのGCCはWARNINGは出るがコンパイル自体は通ってる。

環境に何か問題あるんじゃまいか。

他にエラーとか、警告とか出てないのか?

197:デフォルトの名無しさん
10/04/16 21:17:41
>>193
うちのコンパイラでもエラーはでないな。
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

06.c
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.

/out:06.exe
06.obj


198:デフォルトの名無しさん
10/04/16 21:19:18
>>184
otherwise を「引数リストの型などについて」の意味と解釈した理由を教えていただけませんか?

199:デフォルトの名無しさん
10/04/16 21:27:17
>>193
{
/* 行番号から、ここに何かあると予想 */
long i=0;


200:デフォルトの名無しさん
10/04/16 21:43:23
(4) : error C3872: '0x3000': この文字を識別子で使用することはできません
(5) : error C2143: 構文エラー : ';' が '型' の前にありません。
(6) : error C2065: 'i' : 定義されていない識別子です。
(6) : error C2065: 'i' : 定義されていない識別子です。
(6) : error C2065: 'i' : 定義されていない識別子です。

こうならできたけどなぁ

201:デフォルトの名無しさん
10/04/16 21:48:36
>>187
ほう、ディレクティブっていうのか。
10年C使ってて初めて知ったぜ

202:デフォルトの名無しさん
10/04/16 21:55:43
>>200
何で最初に
(4) : error C3872: '0x3000': この文字を識別子で使用することはできません
これを書かなかったんだ……

何処かに全角文字使ってる。
多分long i=0;の辺り

203:デフォルトの名無しさん
10/04/16 22:03:40
>>200
4-7行目あたりに、他のコード(そこだけなら動く)があるんじゃないか?
で、今度は、それを消した時に、全角文字が残って、
違うエラーがでたんじゃないのか?

204:デフォルトの名無しさん
10/04/16 22:06:28
あ、ちがうちがう。>>200>>193じゃない。
まぎらわしくてすまん。
同じメッセージを出したくて、つい。

205:デフォルトの名無しさん
10/04/16 22:18:35
可能性は∞。

全角文字がある可能性もあるし、人間には見えない文字が紛れ込んでいる可能性だってある。
或いはコンパイラが賢すぎてfor内の条件が1度も満たされない事に気付いてexeを生成するのを拒否してるのかもしれん。

206:デフォルトの名無しさん
10/04/16 22:22:09
>>204
同じメッセージを出したいなら、こんな感じ。

#include <stdio.h>
int main(void)
{
char buf[] = "Hello, world!";

printf( "%s\n", buf );

long j=0;
for (i=1;i>=0xFFFFFFFFFFFFFFF;i++){}
return 0;
}

207:193
10/04/16 22:22:49
すいません
再起動したら直りました

208:デフォルトの名無しさん
10/04/16 22:25:02
Hello worldに書き換えた時に、変な消し方をしてしまった…orz
long j=0; // ×
long i=0; // ○


209:デフォルトの名無しさん
10/04/16 22:29:16
>>206
ああ、その手があったかw

210:デフォルトの名無しさん
10/04/16 22:30:27
>>207
んなアホな…

211:デフォルトの名無しさん
10/04/17 13:17:06
>>187
> 後他に#pragmaってのがあるがこれは俺は使ったことが無いので分からない。

これは何ですか?

212:デフォルトの名無しさん
10/04/17 13:19:25
処理系依存の命令用に用意してあるもの

213:デフォルトの名無しさん
10/04/17 23:47:08
6桁の数字を入力して、その数字の金額の金種を出力するプログラムを作っているのですがうまくいきません
とりあえずここまで作ったのですが…

#include <stdio.h>

int main(void) {
int x[9][2] = {
{ 10000, 0 },{ 5000, 0 },{ 1000, 0 },{ 500, 0 },{ 50, 0 },{ 10, 0 },{ 5, 0 },{ 1, 0 }
} ;
int n,k ;

printf("6桁の数字を入力してください \n");
scanf("%d",&n);

printf("%d円は \n",n);

for( k=0 ; k<9 ; k++ ){
x[k][1] = n/x[k][0] ;
n = n%x[k][0] ;
}

for( k=0 ; k<3 ; k++ ){
printf("%d円札は%d枚 \n", x[k][0],x[k][1] );
}
for( k=3 ; k<9 ; k++ ){
printf("%d円玉は%d枚 \n", x[k][0],x[k][1] );
}

return 0;
}


214:デフォルトの名無しさん
10/04/17 23:50:54
2000円札はいつも忘れられる運命にあるな

215:デフォルトの名無しさん
10/04/17 23:57:42
>>213
っ {100, 0},

216:デフォルトの名無しさん
10/04/18 00:02:44
>>213
つ k<8

217:デフォルトの名無しさん
10/04/18 00:07:22
配列の大きさに対して、紙幣と効果の種類が足りない。
その結果0で割ってるためにエラー。

218:デフォルトの名無しさん
10/04/18 00:12:54
Cってよく高速っていうけどアセンブリほど早いわけじゃないでしょ
なんか中途半端なかんじなんだよね

219:デフォルトの名無しさん
10/04/18 00:14:15
int main(int argc, char **argv) {
  unsigned long  num;
  unsigned char  a, b, c, d, e, f, g, h, i;

  num = strtoul(argv[1], NULL, 0);
  a = num / 10000;
  num %= 10000;
  b = num / 5000;
  num %= 5000;
  c = num / 2000;
  num %= 2000;
  d = num / 1000;
  num %= 1000;
  e = num / 500;
  num %= 500;
  f = num / 100;
  num %= 100;
  g = num / 50;
  num %= 50;
  h = num / 10;
  num %= 10;
  i = num / 5;
  num %= 5;

  fprintf(stdout, "%2u%2u%2u%2u%2u%2u%2u%2u%2u%2u", a, b, c, d, e, f, g, h, i, num);

  return EXIT_SUCCESS;
}

220:デフォルトの名無しさん
10/04/18 00:14:24
最適化有効にしてアセンブリ出力させてみ?
侮れんものがあるぞ?

221:デフォルトの名無しさん
10/04/18 00:14:38
>>218
無理して使わなくてもいいのにw

222:デフォルトの名無しさん
10/04/18 00:14:49
じゃあアセンブラで全部作ってろよw

223:デフォルトの名無しさん
10/04/18 00:16:29
よっぽど注意して設計しないとコンパイラの最適化には勝てないよな。

224:デフォルトの名無しさん
10/04/18 00:19:58
ポータブルアセンブラだもん

225:デフォルトの名無しさん
10/04/18 00:20:31
アセンブラで思い出した
MASMなんかの繰り返し展開マクロ同等の機能がプリプロセッサに欲しいことがある

gcc はプリプロセッサ段で可変引数使えるんだっけ?

226:デフォルトの名無しさん
10/04/18 00:27:28
アセンブラより遅いCを使うくらいなら同じようにアセンブラより遅いJavaでやったほうがよくね?というJava脳の意見でした。

227:デフォルトの名無しさん
10/04/18 00:29:09
>>218
CRC32 を C からアセンブリ言語に直しても 20% くらいしか速度は改善されなかった記憶が。
昨今のハードの進展を考えるとアセンブリのソースは保守性が悪すぎる。
マジレス失礼。

228:デフォルトの名無しさん
10/04/18 00:29:36
>>223
それはCコンパイラに限ったこと?
他のコンパイラでも同じ事がいえるのなら特段Cのアドバンテージではないね

229:デフォルトの名無しさん
10/04/18 00:30:07
>>226
確かに C で書く必然性はないわけで、お好きなように。

230:213
10/04/18 00:30:46
みなさんありがとうございます
まさか100円を忘れていたとは…
もっと注意して確認したいと思います

231:デフォルトの名無しさん
10/04/18 00:32:47
>>230
べっべつにあんたの為なんかじゃないんだからねっ

232:デフォルトの名無しさん
10/04/18 00:42:23
>>228
Cに限ったことじゃないが、Cは歴史が長いだけに最適化もすさまじい。

233:デフォルトの名無しさん
10/04/18 00:46:44
>>232
一番すごいの?
それならちょっと嬉しい

234:デフォルトの名無しさん
10/04/18 00:58:01
最適化ならVerilogの方が遥かに凄い。全くレベルが違う。

235:デフォルトの名無しさん
10/04/18 01:30:00
設計が古いんだから・・・

236:デフォルトの名無しさん
10/04/18 01:39:28
>>233
一番ってこたあないかもしれないけど、
現実をみて考えると相当なものがあるだろう。

C言語では微妙に不便を強いられる分、
ちゃんと見返りもあるんだねぇ

237:デフォルトの名無しさん
10/04/18 07:56:41
しかしqsortなどがinlineじゃないので
ソートなどはC++に敵わない罠

238:デフォルトの名無しさん
10/04/18 07:59:27
自前でソートすればCの方が速い可能性アリ。

239:デフォルトの名無しさん
10/04/18 11:04:46
C++すげぇじゃねぇか。
あの変態文法で涙出そうになったけど。

ただC言語でもコンパイラ拡張でinlineを受け付けるものも
あるらしいから、それなら何とか・・・。


240:デフォルトの名無しさん
10/04/18 13:20:01
qsortと比較関数の両方がinlineならいいだろうけどねえ

241:デフォルトの名無しさん
10/04/18 13:26:10
C1Xでも標準ライブラリ改良する気ないみたいだしな。
qsortがインライン化されていないこともあるが、基本的なデータ構造を扱う関数群がないとか欠陥が多すぎ。
俺queueとか、my_listとかどんだけ無駄に再生産されてるんだよ。

Cのコミュニティーは本当に無能しかいない。

242:デフォルトの名無しさん
10/04/18 13:41:47
静的型の言語は、テンプレートとかジェネリックみたいのが
ないとコレクション関係はつかえねーな。

243:デフォルトの名無しさん
10/04/18 13:56:20
マクロでごり押しできなくはないけどな
まあ、普通は void* でなんとかするんだろうけど

244:デフォルトの名無しさん
10/04/18 15:40:04
>>243
void * で書くのは間接呼び出しが発生して効率が落ちる。

245:デフォルトの名無しさん
10/04/18 18:08:46
なら可変長構造体で

246:デフォルトの名無しさん
10/04/18 18:23:10
qsortをinlineにする
笑ってしまった

247:デフォルトの名無しさん
10/04/18 19:50:18
Cの仕様の範囲内でqsortの比較の最適化を期待するにはinlineしかないだろ

248:デフォルトの名無しさん
10/04/18 22:36:22
>>247
> Cの仕様の範囲内でqsortの比較の最適化を期待するにはinlineしかないだろ
inlineはCの仕様じゃないって知らないのかお前はwwwwww


249:デフォルトの名無しさん
10/04/18 22:50:15
C言語5年やっててinlineって言葉初めて見たんですが、
これはなんですか?釣りでもなく本当にわかりません・・・。

250:デフォルトの名無しさん
10/04/18 23:05:09
>>249
「C99 inline」でググるんだ。

251:デフォルトの名無しさん
10/04/18 23:08:24
>>249
inlineってC++からの輸入じゃね?

252:デフォルトの名無しさん
10/04/18 23:11:41
>>249
インライン関数。

インライン関数とは、凄く簡単に説明すると

void func(void){
printf("test\n");
}

int main(int argc,char** argv){
func();
return 0;
}

↑のようなフザケタコードをコンパイラが
スマートに書き換える機能で、↑の糞コードのような場合

int main(int argc,char** argv){
printf("test\n");
return 0;
}

みたいな感じに書き直してくれる。

253:デフォルトの名無しさん
10/04/18 23:12:24
てかinlineなんてregisterと同じでわざわざ書かないだろ。

254:252
10/04/18 23:16:26
>>249
よくよく考えると>>252の例は酷すぎた。
忘れてくれ。


255:デフォルトの名無しさん
10/04/18 23:21:55
>>253
gccは特にinlineを無視する確率高いよね

256:デフォルトの名無しさん
10/04/18 23:26:24
人間よりもコンパイラの方が大概うまくやってくれる

257:デフォルトの名無しさん
10/04/18 23:28:44
>>256
しかしそのコンパイラを作っているのは人間である。

258:デフォルトの名無しさん
10/04/18 23:30:35
コンパイラのかなりの部分は自動生成されるコードだけどな。

259:デフォルトの名無しさん
10/04/18 23:30:47
>>257
ゲームの人工知能と同じ

260:デフォルトの名無しさん
10/04/18 23:48:54
このまえVC++で、逆アセンブルしてコードみてみたら、
こんな関数までインライン展開すんのかってびっくりした。

261:デフォルトの名無しさん
10/04/19 01:36:21
淫乱関数か。

262:デフォルトの名無しさん
10/04/19 01:37:10
>>250-254
ありがとうございます!
もうちょっと自分で調べて勉強してきます。

263:デフォルトの名無しさん
10/04/19 02:15:31
>>257
同じ人間と思うなよ
コンパイラ作ってるやつは底辺プログラマーよりずっと優秀なんだから

264:デフォルトの名無しさん
10/04/19 02:43:42
>>263
あいつらは宇宙人だから。

おっと、宇宙人と言ってもルーピーは第9地区行きだからな。

265:デフォルトの名無しさん
10/04/19 19:17:54
>>248

266:デフォルトの名無しさん
10/04/19 19:19:54
>>253
inlineは同じ翻訳単位内に書かれないといけないので
inline書かずに同じ事しようと思うと
staticにしないといけなくなるぜ

267:デフォルトの名無しさん
10/04/19 22:23:52
for文内で作ったオブジェクトを全て選択するにはどうしたら良いですか

268:デフォルトの名無しさん
10/04/19 22:51:57
ポインタstartが指してるところから、ポインタendが指してるとこの「間」の文字列を
dataに格納するにはどうしたらいいですか

目的としてはhtmlのタグ取って特定のタグで囲まれてる文字列を抜き出したいんです

269:デフォルトの名無しさん
10/04/19 22:56:08
>>268
sprintf(data, "%.*s", end-start, start);

270:デフォルトの名無しさん
10/04/19 23:37:48
>>269
それっぽいのができました、どうも

fprintfでやったらポインタじゃダメだって怒られたのに、
sprintfだとできるのね

271:デフォルトの名無しさん
10/04/19 23:42:42
>>268
俺だったら正規表現が使える言語に逃げちゃいそうw

272:デフォルトの名無しさん
10/04/19 23:46:05
正規表現は外部ライブラリで補完できるんじゃないの?

273:デフォルトの名無しさん
10/04/20 00:41:09
>>270
> fprintfでやったらポインタじゃダメだって怒られたのに、
ここら辺が特に理解できない

274:デフォルトの名無しさん
10/04/20 00:48:12
fprintf(filep, end-start, start);
な感じでやってみたら、
3番目のargumentはポインタじゃincompatibleだぜ
ってエラーが出た

275:デフォルトの名無しさん
10/04/20 01:47:17
何でそういう変な訳にしたのかわからんが、それだと
2番目の引数ありえんワロス
ってエラーが出ないか?


276:デフォルトの名無しさん
10/04/20 02:42:10
#include <stdio.h>
#include <string.h>

int main( void )
{
char source[256];
char value[256];
int i,j, k = 0;
strcpy( source, "<name>2ch C言語スレ</name>" );
/* ヌル文字まで走査を続ける */
for( i = 0; i < 256 || source[i] != '\0'; i++ ) {
/* 開始タグを検出 => 次の文字が「/」ではない */
if( source[i] == '<' && source[i+1] != '/' ) {
/* 「>」が検出されるまで1文字ずつ調べる */
for( j = ++i; source[j] != '>'; j++ );
i = j;
}
/* 終了タグ検出 => 「<」の次が「/」*/
else if( source[i] == '<' && source[i+1] == '/' ) {
/*それ以上操作する必要がないのでループを抜ける */
break;
} else {
/* 終了タグが検出されるまで、結果保存用配列へ1文字ずつ格納 */
value[k++] = source[i];
}
}
/* ヌル文字挿入(文字列として成立させる為) */
value[k] = '\0';
printf( "対象文字列:%s\n", source );
printf( "抽出文字列:%s\n", value );
       return 0;
}

277:デフォルトの名無しさん
10/04/20 02:43:05
20分くらいで書いたが、sprintf()でやる方が頭を悩ませた。

278:デフォルトの名無しさん
10/04/20 11:17:59
タグを消すだけならこれでもおk
#include<stdio.h>
#include<string.h>

int main(void)
{
char source[256];
char value[256]="";
char *p, *q;

strcpy(source, "<name>2ch C言語スレ</name>dummy string<br><br>");
strcpy(value, source);

for(p=value;(p=strchr(p, '<'));)
{
q=strchr(p+1, '>');
if(q==NULL) break;

memmove(p, q+1, strlen(q+1)+1);
}

printf( "対象文字列:%s\n", source );
printf( "抽出文字列:%s\n", value );

return 0;
}

279:デフォルトの名無しさん
10/04/20 11:32:01
sprintf を使ってみた
#include<stdio.h>
#include<string.h>

int main(void)
{
char source[256];
char value[256]="";
char *start, *end, *dest=value;

strcpy(source, "hello<name>2ch C言語スレ</name>dummy string<br><br>");

for(start=source;(end=strchr(start, '<'));)
{
dest+=sprintf(dest, "%.*s", end-start, start);
start=strchr(end+1, '>');
if(start==NULL) break;
start+=1;
}
if(start) sprintf(dest, "%s", start);

printf( "対象文字列:%s\n", source );
printf( "抽出文字列:%s\n", value );
return 0;
}

280:デフォルトの名無しさん
10/04/20 18:45:20
ヘッダに計算書くっていうプログラムなんだがわかる人いる?
ポインタを応用してヘッダファイルとソースファイル2つ使うらしい

簡単な足し算みたいなんだけどわからん

281:デフォルトの名無しさん
10/04/20 19:07:02
>>280
わかるよ

282:デフォルトの名無しさん
10/04/20 19:43:26
ヘッダファイルに計算する関数を書いておくとか?

283:デフォルトの名無しさん
10/04/20 20:24:07
>>280
日本語でおk

284:デフォルトの名無しさん
10/04/21 00:31:15
URLリンク(ux.getuploader.com)
これの表示するフォントを変えたいと思うのですが僕にはレベルが高すぎでした ゲームの中文化ランチャーで少々いじると日本語化できるようになります。どこでフォントを指定しているのでしょうか。解析お願いします。

285:デフォルトの名無しさん
10/04/21 13:45:26
板違い

286:デフォルトの名無しさん
10/04/21 18:57:30
Cの入門書を読んで
標準関数とWinsckを使いプログラミングできるようになしました。

この次の段階としてはどのような学習をすればいいでしょうか?
ゲームなどは作るつもりありません。
私がやりたいことは画像処理(OCR系の画像解析)や
ネットワーク通信(自分パソコンと友達のパソコンで通信するよなの)を
作りたいと思ってます。
ネットワーク通信はWinsockをもっと勉強すればいいかな?と思いますが、
画像処理などはどうなんでしょう?

287:デフォルトの名無しさん
10/04/21 19:03:55
>>286
パソコン通信()

288:デフォルトの名無しさん
10/04/21 19:11:25
>>286
とりあえずぐぐってみた?
ある程度それで概要をつかむほうがいいと思う

289:デフォルトの名無しさん
10/04/21 19:11:43
>>287
パソコン通信ですか・・・
それはWinsockとは違うのですか?

290:デフォルトの名無しさん
10/04/21 19:14:04
>>286
>ネットワーク通信はWinsockをもっと勉強すればいいかな?
Winsockの基本さえわかれば、
(自分パソコンと友達のパソコンで通信)程度なら作れるはずだよ。
作ればいいだけ。

>画像処理などはどうなんでしょう?
特に何も必要でないよ。すぐに作ればいいんじゃない。
OCRなら大した知識などなくてもすぐに作れるよ。

少しぐらいは自分の頭で考えようよ。

291:デフォルトの名無しさん
10/04/21 19:16:00
>>290
> OCRなら大した知識などなくてもすぐに作れるよ。
OCRがすぐ作れるって?
お前すごすぎだろ

> 少しぐらいは自分の頭で考えようよ。
それはまあごもっとも。


292:デフォルトの名無しさん
10/04/21 19:21:00
>>290
ありがとうございます。

OCRって簡単なんですか・・・
頑張って作ってみます。

293:デフォルトの名無しさん
10/04/21 19:28:46
>>291
OCRって言ってもピンきりだろ。そりゃ製品レベルは無理に決まってる。

けど、例えば数字に限定したものとか、
ベクターでなくビットマップベースにするとか、
そういう限定があればすぐに作れるだろ。

最初はそれでいいんだし、そこから改良を加えていけば幾らでも認識率は高くできる。

294:デフォルトの名無しさん
10/04/21 19:33:06
>>293
jpgファイルとかで最初は英数字だけの解析をしたいのです・・・
なにを勉強すればいいですか?
ホントに入門書上がりで最近やっとWinsockでFTPやPOP、HTTP通信が
できるようになってきたひよっこです・・・

295:デフォルトの名無しさん
10/04/21 19:46:54
統計とかパターン認識とか
高級なことをしたいならウェーブレット変換とかで特徴抽出できる
簡単にやりたいならOpenCVでできる、まぁ原理が知りたければSIFTとかSURFとかの論文読めばいいよ
SIFTとか特許があるから気を付けてね

ネットワーク関係は専門じゃないので詳しくは知らない
トランスポート層しか扱ったこと無いので、詳しくは他の人頼む

296:デフォルトの名無しさん
10/04/21 20:29:38
次は画像フォーマットを知ることじゃないの?
ビットマップは単純だからビットマップからはじめると良い。
ビットマップ画像を読みこんで白黒化して出力するツールをつくれ

297:デフォルトの名無しさん
10/04/21 20:44:16
>>295
ありがとうございます。
論文って苦手なんですけど、
やっぱり避けて通れないのですね・・・


>>296
わかりました。
ビットマップ画像から作成してみます。
ライブラリはDXでいいですよね?

298:デフォルトの名無しさん
10/04/21 21:08:04
Cの標準ライブラリだけで十分。コンソールで良い。

299:デフォルトの名無しさん
10/04/21 21:15:20
そもそも行列とかフーリエ変換とかしってるのかな?


300:デフォルトの名無しさん
10/04/21 21:17:00
応用代数学勉強すればいいと思うよ
画像処理アルゴリズムとかそのものずばりの本もあるし。
学校行っていないのならデジタル画像処理とかの資格試験勉強すればいいんで内科医?


301:デフォルトの名無しさん
10/04/21 21:19:16
国家資格は年2回試験があるから挑戦したら?
自信あるなら2級当たりから始めるといいかもシレン
3級は基礎知識だから名

302:デフォルトの名無しさん
10/04/21 22:59:49
国家資格ですか・・・
基本情報技術者なら午後の選択C言語で取りました。
19年度の春試験。

303:デフォルトの名無しさん
10/04/21 23:07:25
>>300
でもずばり jpg を説明した書籍となるといいのがみつからないなあ。
URLリンク(www.amazon.co.jp)
これの第一版はもっている、もっているだけやけど。

304:デフォルトの名無しさん
10/04/21 23:43:40
>>303
俺はその本でJPEGのエンコード・デコードは実装できたなー。
DCTとか概念的なところは「これならわかる!応用数学教室」(だっけ?)が分かりやすかった。

305:デフォルトの名無しさん
10/04/22 00:10:14
#include <stdio.h>
#include <string.h>
#include <locale.h>
#include <stdlib.h>
#include <wchar.h>
main(){
wchar_t kana[] = L"あいうえおかきくけこ";//---1
setlocale(LC_ALL, "");
printf("kana::%ls\n", kana);
printf("kana[2]::%lc\n", kana[2]);
wchar_t wbuf[81], *p1;//----------------------2
printf("enter wide_byte character::\n");
fgetws(wbuf, sizeof wbuf, stdin);
if((p1 = wcschr(wbuf, '\n')) != NULL)
*p1 = L'\0';
setlocale(LC_ALL, "");
printf("wbuf_no_naiyou::\n");
printf("%ls\n", wbuf);
printf("wbuf[2]::%lc\n", wbuf[2]);

return 0;
}

306:305
10/04/22 00:12:58
windows上bccで、日本語文字列の入力を配列に受け取って、その要素にアクセスするのが目的です。

1既存のワイド文字列へのアクセス
ができたので、
2ワイド文字列の入力を受けてその要素へのアクセス
をしようとしたのですが、fgetwsに1byte文字を入力したときはうまくいくのに、
ワイド文字を入力するとfgetwsのエコーバックが見えるところで止まってしまいます。
どうしたらいいでしょう?みかか変換プログラムを書いてみようと思ったのです。


307:デフォルトの名無しさん
10/04/22 00:23:25
画像処理の資格はこれでしょ
CG-ARTS協会|2010CG検定
URLリンク(www.cgarts.or.jp)
これを3級から始めれば高校生程度の学力から初めても大丈夫


308:デフォルトの名無しさん
10/04/22 00:28:06
>>306
cじゃなくてrubyでやったら?
Cじゃなきゃいけない理由って何?

309:デフォルトの名無しさん
10/04/22 00:28:36
宗教上の理由からです

310:デフォルトの名無しさん
10/04/22 00:29:17
>>297
ライブラリ使うんなら別にどの形式からでもいいよ
ファイルフォーマットを知る必要もたいしてなかろ

311:デフォルトの名無しさん
10/04/22 00:37:41
へえ

312:デフォルトの名無しさん
10/04/22 01:06:51
ウヒヒ

313:デフォルトの名無しさん
10/04/23 08:37:56
>>306
Microsoftでやったら?
bccじゃなきゃいけない理由って何?

314:デフォルトの名無しさん
10/04/23 14:25:37
intの2次元配列を使いたいのですが、int hoge [作りたい数]「ここ」←ここはなにを表してるのですか?
charならバイト数だと思うのですが、intはバイト数が決まってたと思うのですが
作りたい数までの各番号に対応したintを取り出したいのです

315:デフォルトの名無しさん
10/04/23 15:03:35
>>314
お前がいうところの2次元配列ってなんだ?

世間では要素が n 個の配列(1次元配列)は hoge[n] であり、
要素が n x m 個の配列(2次元配列)を hoge[n][m] で表す。

1次元で足りるなら1次元配列を使え。

316:デフォルトの名無しさん
10/04/23 15:03:44
それなら1次元配列でよくね?

317:デフォルトの名無しさん
10/04/23 15:05:53
つまりint hoge[作りたい数]でいけるってことですか。
そういう使い方を全然知りませんでした。ありがとうございました

318:デフォルトの名無しさん
10/04/23 15:06:33
>>314
int hoge[3]; はintが3個並んでる。
int hoge[3][4]; はintが4個並んだものが3個並んでる。
hoge[0][0], hoge[0][1], hoge[0][2], hoge[0][3], hoge[1][0], hoge[1][1], ... の順で。

intのバイト数は規格で固定されてはいない。
実際にコンパイルする時にその環境で何バイトになるのかはそりゃ決まってるけど。
今はPCの環境だとほとんど4バイト。

319:デフォルトの名無しさん
10/04/23 15:16:51
charでバイト数を指定して2次元配列、か。
それはたぶん文字列の配列を作ろうとしていたんじゃないかな。

320:デフォルトの名無しさん
10/04/23 18:05:22
C言語でシーザー暗号の解読プログラムを作っています。
手順としては、暗号化された文字列を入力して1つずつ文字列をずらして
26通りの文字列を出力するプログラムです。

#include<stdio.h>
int main(void)
{
char ang[8]; //今回は最大8文字の文字列
int i,j;

for(i=0;i<26;i++){
for(j=0;j<8;j++){
printf("%c",ang[j]+i);
}
}

初めはASCIIコードのZとaが繋がっているものと思いこう組んだら
Zの後には記号が入っていて詰まってしまいました。
A-Zまでの配列を作ってその中で回す、とかASCIIコードでもZの次をAにする
とか色々考えましたが、どうしていいのかが分からないです…。

ご指導お願いします。

321:デフォルトの名無しさん
10/04/23 18:10:44
(ang[j] - 'A' + i) % 26 + 'A'

322:デフォルトの名無しさん
10/04/23 18:28:17
>>320
isalpha()

323:デフォルトの名無しさん
10/04/23 18:37:27
>>320
本題とは関係ないが、
>char ang[8]; //今回は最大8文字の文字列
ang[8]だと最大7文字の文字列な

324:デフォルトの名無しさん
10/04/23 18:41:29
NUL終端文字列とは言ってないので、間違っていない
それにprintf("%c",ang[j]+i);だから、NULは必要としていないと読める

325:デフォルトの名無しさん
10/04/23 18:50:38
ポインタ無隋って聞いたけど
C言語の入門書とかに書いてるような小さいサンプルコードだと
全然難しくなくて何が難しいのかわからなかった。

ポインタってなんかむずかしい部分あるの?

326:デフォルトの名無しさん
10/04/23 18:51:26
NUL終端w

327:デフォルトの名無しさん
10/04/23 18:53:34
分かる人には難しくない、分からない人には難しい。
慣れればどうってことはない。

328:デフォルトの名無しさん
10/04/23 19:00:50
>>325
入門編が難しいはずない。

329:デフォルトの名無しさん
10/04/23 19:04:05
初心者は、LinkedListを自前で実装してみ?って言われて初めて、
自分がポインタを理解していないことに気づくもの。

330:デフォルトの名無しさん
10/04/23 19:07:33
>>325
人によるんじゃない?
俺は関数ポインタの理解が遅かったけど、いざ理解したらなにが難しかったのか分からなくなったな

331:デフォルトの名無しさん
10/04/23 19:11:03
何も有益な情報は残さずに読むものを不快にさせるだけのレスをするやつは死ねばいいのにな

332:デフォルトの名無しさん
10/04/23 19:12:48
int (*(*foo)(int (*(*)(void))(void)))(int (*)(void))

333:デフォルトの名無しさん
10/04/23 19:13:21
俺は死ねばいいとか思わないけど、なんで>>331は自殺しないの?

334:デフォルトの名無しさん
10/04/23 19:20:08
ポインタと配列がごっちゃになってしまうところ
ある配列の実要素が ポインタである(ポインタ配列)場合 配列である(2次元配列)場合
各それぞれで、記憶領域の配置が本質的に違うのに理解できるまでの敷居が高い。

既に書かれている記述を読むのは可能でも
やりたいことを実装するのに、どちらが適切かを選択できるか がキーポイント

335:デフォルトの名無しさん
10/04/23 19:21:54
関数の引数や戻り値にポインタ変数が使われる場合なんかも初心者は混乱しやすいな

336:デフォルトの名無しさん
10/04/23 19:24:36
次元配列って

□□□□□□□□□
□□□□□□□□□
□□□□□□□□□
□□□□□□□□□
□□□□□□□□□

こんな感じで
配列の実要素がポインタってのは

□→□□□□□□□□□
□→□□□□□□□□□
□→□□□□□□□□□
□→□□□□□□□□□
□→□□□□□□□□□

こういうこと?

337:デフォルトの名無しさん
10/04/23 19:30:14
>>336
おおよそ yes
指している先がどれだけの大きさの器があるか未確定 & ほとんど知る術は無い
(さらに、不正な場所を指している可能性もあるん)

□→□□□□
□→□□□□□□□
□→□
□→ぬるぽ!
□→鼻から悪魔

こういうことがあり得る

338:デフォルトの名無しさん
10/04/23 19:34:43
>>321
割った余りで考えるという思考がありませんでした…。
ありがとうございました!

>>322
真偽でif文作るってのがあるのを知りませんでした。
勉強になりました!

339:デフォルトの名無しさん
10/04/23 21:27:13
>>332
これ関数ポインタ?

DLLの関数を動的に呼ぶときに、
GetProcAdress()で関数ポインタ取ってくるくらいしか使い道が分からん。

340:デフォルトの名無しさん
10/04/23 21:38:28
分かりやすそうなところを選ぶとしたらイベントハンドラとかかな。

341:デフォルトの名無しさん
10/04/23 22:14:53
>>339
引数を取らず引数を取らずintを返す関数へのポインタを返す関数へのポインタを取り、
引数を取らずintを返す関数へのポインタを取りintを返す関数へのポインタを返す関数
へのポインタだね。

342:デフォルトの名無しさん
10/04/23 22:27:42
ええい、いいから黙ってtypedefしろ

343:デフォルトの名無しさん
10/04/23 22:35:09
typedefしまくりで夢がひろがりんぐ

344:デフォルトの名無しさん
10/04/23 23:21:31
URLリンク(kansai2channeler.hp.infoseek.co.jp)

番号と名前がランダムに記入されたテキストを読み込んで、数字と名前に分けて配列に格納し、番号昇り順で並べかえてテキストファイルで出力したいのですが
並べかえがうまくいきません
とりあえず作ってみたのですが…
アドバイスください

345:デフォルトの名無しさん
10/04/23 23:26:57
>>344
tmp はいらない
ソートができていない
ソートが終わってから出力すればいい

誰かに写させてもらったの?

346:344
10/04/23 23:33:00
過去に作ったやつを何個か組み合わせて作ってたらこうなりました…

347:デフォルトの名無しさん
10/04/23 23:33:07
>>344
番号、名前、テキストの定義をすると話が早いと思う。

例:
番号は、'0'から'9'の文字からなる文字列
名前は、ひらがな、かたかな、漢字からなる文字列
テキストは、番号と名前をスペースからなる文字列で、最後以外の番号および名前の後には必ずスペースが来る。

11113 3333 5892739 山田 12128384 高橋 32939 8883 細川 32932399

とか。

348:デフォルトの名無しさん
10/04/23 23:37:36
>>344
ヒント
for
    fscanf

for
    for
        if

for
    fprintf

349:デフォルトの名無しさん
10/04/23 23:41:59
>>344

まず

 1.ファイルを全部読む
 2.並び替えを行う
 3.並び替えたデータをファイルに書く

っていう流れに書き換えて
2.の部分をじっくり考えてみてください。

350:349
10/04/23 23:43:51
>>348
もろかぶったスマンw

351:デフォルトの名無しさん
10/04/24 00:47:16
関数から構造体を返す必要がある場合、何か基準や定石はありますか?
こういう時にはこうすれば良いという指針があれば知りたいです。

//構造体の例
struct my_struct {
 int size;
 void *ptr;
 int data[];
};

//(1)create関数の中で構造体をmallocして、delete関数の中でfreeする。
struct my_struct* create_my_struct(int param);
void delete_my_struct(struct my_struct* md);

//(2)呼び出し元で構造体を確保して、init関数の中でメンバーをmallocして、release関数の中でメンバーをfreeする。
// 構造体そのものは呼び出し元でどうにかする。
int init_my_struct(struct my_struct* md, int param);
void release_my_struct(struct my_struct* md);

それぞれ下記のデメリットがあると思います。

(1)のデメリットは呼び出し元で入れたいメモリー領域がある場合、createした構造体をコピーする必要がある。
(2)のデメリットは呼び出し元でinitを呼ぶ前に構造体の大きさを知っていなければいけない。

352:344
10/04/24 00:55:12
皆さんのアドバイス通りに流れを考えて、いちからやり直したら無事成功しました。
ありがとうございました。

353:デフォルトの名無しさん
10/04/24 01:20:37
>>351
(1)のデメリットがよくわからんな
そのメモリ領域ってのは create で確保するんじゃないの?
あとコピーうんぬんはコピー用の関数でOK?


354:デフォルトの名無しさん
10/04/24 01:51:37
>>353
実装はこんな感じです。

struct my_struct* create_my_struct(int param)
{
 struct my_struct* md = (struct my_struct*)malloc(sizeof(struct my_struct) + sizeof(int)*param);
 md->size = param;
 md->ptr = malloc(param);
 return md;
}

void delete_my_struct(struct my_struct* md)
{
 free(md->ptr);
 free(md);
}

デメリットは、下記のような場合、memcpyが必要なことです。

int get_data(char* buf, int size)
{
 struct my_struct* md = create_my_struct(size);  //←ここでbufを渡せたら
 int ret = memcpy(buf, md->ptr, size);         //←ここでコピーしなくていい
 delete_my_struct(md);
 return ret;
}

355:デフォルトの名無しさん
10/04/24 02:02:09
なんか違和感があるな。どういう思想なんだろ

356:デフォルトの名無しさん
10/04/24 02:49:32
>>354
*ptrの使い道はなんだろ。つーか、メンテしやすさ重視ならこうじゃね?


typedef struct {
 int size;
 int chinko;
 int unko;
 int data[];
} unko_t ;

unko_t *create_unko( unko_t *md, char *buf, size_t size )
{
 md = malloc( sizeof(unko_t) + sizeof(int)*size );
 if(md){
  md->size=size;
  memcpy(md->data,buf,size);
 }
 return md;
}

int get_data(char *buf, int size)
{
 unko_t *md;
 if( create_unko( md, buf, size )==NULL ) perror("unko");


357:デフォルトの名無しさん
10/04/24 02:50:30
途中で送信しちゃったよもうどうでもいいや

358:デフォルトの名無しさん
10/04/24 02:58:38
>>354
まぁよくわからないんだけど、こんな感じにすればOK?

struct my_struct* create_my_struct(int param, char *buf)
{
 struct my_struct* md = (struct my_struct*)malloc(sizeof(struct my_struct) + sizeof(int)*param);
 md->size = param;
 md->ptr = malloc(param);
 if (buf)
  memcpy(md->ptr, buf, size);
 return md;
}


なんにせよ、構造体のサイズが不定って段階で create/delete 方式だね。
後でもっとよい実装を思いついたときにも直しやすそうだ。


359:デフォルトの名無しさん
10/04/24 02:59:04
いや、全然ダメだろ
create_unko()の第一引数が冗長だし、リソース開放できなくなってるし
どうでもいいけど、いまどきvoid *の代わりにchar *使わなくても
あと、変更しない変数にはconstを明示的に付けた方が幸せになれる

360:デフォルトの名無しさん
10/04/24 03:00:37
豪快にかぶったけどまあどうでもいいな

361:351
10/04/24 03:04:33
分かりにくかったので、>>354に追加します。

int do_some_process_to_my_struct(struct my_struct* md, int param)
{
 for(int i = 0; i < md->size; i++){
  ((int*)md->ptr)[i] = param+i;
 }
 return param+i;
}

int get_data2(char* buf, int size)
{
 struct my_struct* md = create_my_struct(size);  //←ここでbufを渡せたら
 do_some_process_to_my_struct(md, 12345);
 int ret = memcpy(buf, md->ptr, size);         //←ここでコピーしなくていい
 delete_my_struct(md);
 return ret;
}


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4989日前に更新/245 KB
担当:undef