Comment On OMGWTF Finalist #03: The estimator

This is the third article in a twelve-part series that discusses the twelve finalists and their calculator submissions for the OMGWTF Programming Contest. The entries are being presented in the order submitted, and the winner will be announced on June 18, 2007. [expand full text]
« PrevPage 1Next »

Re: OMGWTF Finalist #03: The estimator

2007-06-05 09:27 • by DOA (unregistered)
nice, very nice

Re: OMGWTF Finalist #03: The estimator

2007-06-05 09:29 • by BradC
Heh. I've written an XML "parser" like that. Well, not each character in succession, but just looking for the "magic" value in the middle.

Nice WFT'ery!!!

Re: OMGWTF Finalist #03: The estimator

2007-06-05 10:02 • by wow (unregistered)
beautiful!

Re: OMGWTF Finalist #03: The estimator

2007-06-05 10:08 • by Sid2K7 (unregistered)
I just died a little inside.

Very inspired work, Keith, VERY inspired.


captcha: craaazy - indeed!

Re: OMGWTF Finalist #03: The estimator

2007-06-05 10:10 • by MX5Ringer
Hey that's not fair!!
I had a proper comment in my post and everything :((

Ok, Ok, Perhaps I shouldn't have replied to the stroppy post, I should have just started a new one.

Anyway,

Nice WTF!
Personally I prefer #02 tho, I'm still chuckling about it now. (Would have liked it even more if the cached results were slower to find than the uncached ones tho)

Thanks

Re: OMGWTF Finalist #03: The estimator

2007-06-05 10:19 • by JokerPokerUberSmoker (unregistered)
The best I've seen so far

Re: OMGWTF Finalist #03: The estimator

2007-06-05 10:26 • by PAG (unregistered)
I really like the idea of a contest to use a overly complicated solution to a simple problem.

I know everybody can badly code, but only a handful of person can do this effectively...

Re: OMGWTF Finalist #03: The estimator

2007-06-05 10:40 • by PSWorx
I also like the XML format he used. Like W3CSchools already so wisely stated, "we should always keep web services generic"...

Re: OMGWTF Finalist #03: The estimator

2007-06-05 10:47 • by FDF (unregistered)
Some people have just too much free time.

Re: OMGWTF Finalist #03: The estimator

2007-06-05 10:51 • by Someone (unregistered)
Alex:

The value it’s from XML comes from server_send_value():


Which calculator did you use to help you write this sentence?

Re: OMGWTF Finalist #03: The estimator

2007-06-05 10:54 • by Random832
TRWTF is, XML is case-sensitive anyway, so he didn't need all those extra ORs.

Re: OMGWTF Finalist #03: The estimator

2007-06-05 11:01 • by Frost Cat (unregistered)
/* compare two strings */

int string_equals( const char *s1, const char *s2 ) {
int sum1 = 0;
int sum2 = 0;

do { sum1 += *s1; } while( *( ++s1 ) );
do { sum2 += *s2; } while( *( ++s2 ) );

return sum1 == sum2;
}


Wow,that's impressive. "16" == "61" and probably "34" and "2221" as well.

Re: OMGWTF Finalist #03: The estimator

2007-06-05 11:14 • by klucas
140021 in reply to 140020
It's close enough to strcmp(), and it works correctly in the place that I use it.

Re: OMGWTF Finalist #03: The estimator

2007-06-05 11:21 • by SomeCoder (unregistered)
140022 in reply to 140015
FDF:
Some people have just too much free time.


I was thinking the exact same thing.

Re: OMGWTF Finalist #03: The estimator

2007-06-05 11:22 • by AdT (unregistered)
Hugs is much more useful than bc. And what's more 31337 than funx10n41 P0R64|\/||\/|1N6?

Re: OMGWTF Finalist #03: The estimator

2007-06-05 11:26 • by Chris (unregistered)
140024 in reply to 140020
"16" == "61" == "34" != "2221"

There's a huge DC offset on the ASCII values that kicks in as soon as you've got extra characters.

Re: OMGWTF Finalist #03: The estimator

2007-06-05 11:37 • by Coincoin
140025 in reply to 140020
This solution is still better than...
s1.GetHash() == s2.GetHash()

...because you will quickly notice the sum compare is failing and will promptly fix it. If you compare hashes, the bug will be so uncommon nobody will ever take the time to debug and fix it and people will just blame it on cosmic rays.

Re: OMGWTF Finalist #03: The estimator

2007-06-05 11:50 • by diaphanein (unregistered)
140027 in reply to 140020
Frost Cat:
/* compare two strings */

int string_equals( const char *s1, const char *s2 ) {
int sum1 = 0;
int sum2 = 0;

do { sum1 += *s1; } while( *( ++s1 ) );
do { sum2 += *s2; } while( *( ++s2 ) );

return sum1 == sum2;
}


Wow,that's impressive. "16" == "61" and probably "34" and "2221" as well.


Another nugget: If either of the strings is empty, you'll either segfault, or read a whole lotta garbage.

Re: OMGWTF Finalist #03: The estimator

2007-06-05 12:04 • by T P (unregistered)
I like how editing the "cache" allows you to define your own math.

For example, I changed test.txt in C:\5.0000-ADD-5.0000 to be 3.14159

Re: OMGWTF Finalist #03: The estimator

2007-06-05 12:05 • by T P (unregistered)
Of course, my personal WTF for the day is commenting on #03 instead of #02.

Re: OMGWTF Finalist #03: The estimator

2007-06-05 12:06 • by Ancient_Hacker
This *is* pretty bad. I didnt submit mine, as I got sick working on it. The idea was to write out two files of lengths x and y, execute "type x+y >z; dir /b z", then extract the file length sum from the directory listing. It worked, for small values of "worked".

Re: OMGWTF Finalist #03: The estimator

2007-06-05 12:42 • by Me (unregistered)
140038 in reply to 140016
Someone:
Alex:

The value it’s from XML comes from server_send_value():


Which calculator did you use to help you write this sentence?


I believe "extracted" was extracted.

Re: OMGWTF Finalist #03: The estimator

2007-06-05 12:57 • by Josh (unregistered)
Wow. Thats so awesome. You have made my day!

And I say that as a calculator expert - http://blog.i2pi.com/category/calculator/

:)

Re: OMGWTF Finalist #03: The estimator

2007-06-05 13:37 • by MikeCD (unregistered)
I'm a big fan of the my_malloc() implementation, especially as I've seen it in the wild :-/

Re: OMGWTF Finalist #03: The estimator

2007-06-05 14:04 • by ailivac
This is definitely my favorite out of the four posted so far, and I think it will be hard for any of the eight to come to top this. The unnecessarily complicated "distributed" design was good, but its frequent re-creation of basic library routines made it even better.

For the XML part, this looks like a great example of someone who completely missed the point of XML and uses it just for the sake of being able to say their program uses XML. The advantage of using XML comes when you need to store or exchange a large data structure, since XML generators and parsers are available for almost any platform you might need. If you write your own parser and generator, it looks mostly stupid, but if might still be worth it if you're storing a lot of information in it or sending it to another program. But when you have exactly one piece of important information in the whole document, then it's 100% WTFery.

I also liked the custom C<string_length> (I know BBCode isn't POD, but i can pretend) function. It seems to work by grabbing 4-byte chunks of the string and shifting them around to check for 0 bytes in the different positions (although I might have something wrong, since it looks like it would only work if C had short-circuit logical and, which I didn't think it did). It's just the kind of code one of those "premature optimization" people would write after hearing that reading memory at the full alignment boundary is much faster than doing it one byte at a time. (processors have had cache memory for how many decades now?)

Re: OMGWTF Finalist #03: The estimator

2007-06-05 14:06 • by klucas
140046 in reply to 140041
MikeCD:
I'm a big fan of the my_malloc() implementation, especially as I've seen it in the wild :-/


Whoa, I haven't seen it in the wild. I based it off something that I found at work that was like this:


void *my_malloc(size_t size) {
void *ptr = NULL;

ptr = malloc(size);
if (ptr == NULL) {
ptr = malloc(size);
if (ptr == NULL) {
exit(-1);
}
}
}


Ironically, g_malloc() does not return NULL unless size is 0. If g_malloc() fails, the program exits.

Re: OMGWTF Finalist #03: The estimator

2007-06-05 14:09 • by klucas
140047 in reply to 140045
ailivac:
This is definitely my favorite out of the four posted so far, and I think it will be hard for any of the eight to come to top this. The unnecessarily complicated "distributed" design was good, but its frequent re-creation of basic library routines made it even better.

For the XML part, this looks like a great example of someone who completely missed the point of XML and uses it just for the sake of being able to say their program uses XML. The advantage of using XML comes when you need to store or exchange a large data structure, since XML generators and parsers are available for almost any platform you might need. If you write your own parser and generator, it looks mostly stupid, but if might still be worth it if you're storing a lot of information in it or sending it to another program. But when you have exactly one piece of important information in the whole document, then it's 100% WTFery.

I also liked the custom C<string_length> (I know BBCode isn't POD, but i can pretend) function. It seems to work by grabbing 4-byte chunks of the string and shifting them around to check for 0 bytes in the different positions (although I might have something wrong, since it looks like it would only work if C had short-circuit logical and, which I didn't think it did). It's just the kind of code one of those "premature optimization" people would write after hearing that reading memory at the full alignment boundary is much faster than doing it one byte at a time. (processors have had cache memory for how many decades now?)


C does have short-circuited AND; that's how it works.

Re: OMGWTF Finalist #03: The estimator

2007-06-05 14:13 • by Roy (unregistered)
Submitter #03:
There are whole host of other gems in util.h, including:

* my_malloc() - malloc with error recovery (by calling itself again on failure)

What, you mean, like in sysvinit's source code?

/*

* Non-failing allocation routines (init cannot fail).
*/
void *imalloc(size_t size)
{
void *m;

while ((m = malloc(size)) == NULL) {
initlog(L_VB, "out of memory");
do_sleep(5);
}
memset(m, 0, size);
return m;
}

Re: OMGWTF Finalist #03: The estimator

2007-06-05 14:31 • by topcat_arg
i having a lot of fun today reading this.. although there were a lot of time since I read C++ code...

anyway: I think that this comment (/* case insensitive */) should be taken out, it's makes code clear! (unless it's case insensitive..)

Re: OMGWTF Finalist #03: The estimator

2007-06-05 14:44 • by BradC
140055 in reply to 140030
Ancient_Hacker:
This *is* pretty bad. I didnt submit mine, as I got sick working on it. The idea was to write out two files of lengths x and y, execute "type x+y >z; dir /b z", then extract the file length sum from the directory listing. It worked, for small values of "worked".


My new favorite phrase.

Re: OMGWTF Finalist #03: The estimator

2007-06-05 15:02 • by Taejo
140056 in reply to 140009
MX5Ringer:

Nice WTF!
Personally I prefer #02 tho, I'm still chuckling about it now. (Would have liked it even more if the cached results were slower to find than the uncached ones tho)


My calculator's cache is slower than working stuff out (for addition and subtraction; my multiplication and division are extremely slow). Database access requires constructing the query string (in XML Lisp) using strcat (O(L^2) where L = len(query)), parsing that (my parser does recreate XML's tree structure, but it requires that tags be surrounded by spaces), executing the parse tree (with each variable reference in O(V) for V variables in the environment) and then O(N) to find the item in the cache (it's a linked list).

Of course, this is all done even if the item isn't in the cache: so that's even slower. But in many cases, cache access time dominates.

Re: OMGWTF Finalist #03: The estimator

2007-06-05 15:27 • by H3SO5
I LOVE IT! This will become my main calculator.

Re: OMGWTF Finalist #03: The estimator

2007-06-05 15:33 • by rjnewton
So how does one distinguish between a divide-by-zero error and a legitimate answer to 1867964280 * 2?

Re: OMGWTF Finalist #03: The estimator

2007-06-05 15:56 • by klucas
140062 in reply to 140060
rjnewton:
So how does one distinguish between a divide-by-zero error and a legitimate answer to 1867964280 * 2?


It's stored as a double not an int. A double is 64 bits, and an int is 32 bits. I set the first 32 bits of the double to be 0xdeadbeef, then treat it as a double. The result is random because the second 32 bits are uninitialized.

I run this:


main() {
union {double d; unsigned int i;} u;
u.i = 0xdeadbeef;
printf("%g\n", u.d);
}


And I get a different result every time.

Re: OMGWTF Finalist #03: The estimator

2007-06-05 17:16 • by mh (unregistered)
140069 in reply to 140046
klucas:
MikeCD:
I'm a big fan of the my_malloc() implementation, especially as I've seen it in the wild :-/


Whoa, I haven't seen it in the wild. I based it off something that I found at work that was like this:


void *my_malloc(size_t size) {
void *ptr = NULL;

ptr = malloc(size);
if (ptr == NULL) {
ptr = malloc(size);
if (ptr == NULL) {
exit(-1);
}
}
}


Ironically, g_malloc() does not return NULL unless size is 0. If g_malloc() fails, the program exits.

I bloody well WROTE something similar in production code once! It went something like:

- search for a free slot in a linked list
- if found return it, otherwise...
- add a new empty list member to the start
- call recursively

Perfectly viable code when used properly, but obviously a WTF when it's copied without understanding. ;D

Re: OMGWTF Finalist #03: The estimator

2007-06-05 19:29 • by Mark McConnell (unregistered)
bc rules, and you are elite for it. though, you didn't notice the 'ibase' and 'obase' variables inside bc, apparently.. making you slightly less elite.

Re: OMGWTF Finalist #03: The estimator

2007-06-05 19:56 • by chrismcb
140085 in reply to 140069
mh:

I bloody well WROTE something similar in production code once! It went something like:

- search for a free slot in a linked list
- if found return it, otherwise...
- add a new empty list member to the start
- call recursively

Perfectly viable code when used properly, but obviously a WTF when it's copied without understanding. ;D


You CREATED the NODE then ADDED it to the start... WHY do you need to make a recursive call?

Re: OMGWTF Finalist #03: The estimator

2007-06-06 14:23 • by Mad Merlin (unregistered)
It looks like the the code isn't 64-bit clean either, it just segfaults whenever you try to push a second button. That problem doesn't crop up when compiled as 32-bit code though.

Re: OMGWTF Finalist #03: The estimator

2007-06-07 17:20 • by klucas
140311 in reply to 140155
Mad Merlin:
It looks like the the code isn't 64-bit clean either, it just segfaults whenever you try to push a second button. That problem doesn't crop up when compiled as 32-bit code though.

That's a feature. It doesn't work on bigendian either.

Re: OMGWTF Finalist #03: The estimator

2008-08-07 00:24 • by ELIZA (unregistered)
210646 in reply to 140085
chrismcb:
mh:

I bloody well WROTE something similar in production code once! It went something like:

- search for a free slot in a linked list
- if found return it, otherwise...
- add a new empty list member to the start
- call recursively

Perfectly viable code when used properly, but obviously a WTF when it's copied without understanding. ;D


You CREATED the NODE then ADDED it to the start... WHY do you need to make a recursive call?


Chris, think this through.
As I understand it, the code reads:
1) If there is a free node then 1i) Return it
2) Add node
3) Call steps 1 through 3

If I were writing it, I would write it as:
1) If there is a free node then 1i) Return it
2) Add node
Either
3A) Call step 1i
Or
3B) Return it
Depending on how complicated the return code. In fact, I would more likely write:
1) If there is no free node then 1i) add node
2) Return it
(in more formal pseudocode, it would be:
To_Return = FindFreeNodeAndReturnPointerOrReturnNULL(list)
If To_Return == NULL Then AddNodeAndReturnPointer(list)
Return To_Return
)
Although I could imagine someone writing a whilst-loop for the task:
While To_Return == NULL
To_Return = pointer of first free node found
To_Return = pointer of added free node
End Loop
Return To_Return

PS If a function returns a pointer, is it still called the return value?

Re: OMGWTF Finalist #03: The estimator

2008-11-28 21:35 • by 855 (unregistered)
丽水货架
金华货架
衢州货架
余杭货架
萧山货架
临安货架
德清货架
平湖货架
海宁货架
桐乡货架
奉化货架
余姚货架
慈溪货架
诸暨货架
义乌货架
瑞安货架
永嘉货架
安徽货架
合肥货架
芜湖货架
马鞍山货架
铜陵货架
宣城货架
巢湖货架
山东货架
济南货架
轻型货架
轻型货架
中型货架
重型货架
悬臂货架
模具货架
阁楼货架
南京货架
镇江货架
苏州货架
扬州货架
徐州货架
南通货架
盐城货架
淮阴货架
连云港货架
常州货架
浙江货架
无锡货架
上海货架
杭州货架
湖州货架
嘉兴货架
宁波货架
台州货架
绍兴货架
衢州货架
温州货架
金华货架
萧山货架
海宁货架
临安货架
慈溪货架
余姚货架
建德货架
路桥货架
仓储笼
登高车
料箱
液压搬运车
堆垛车
平台车
塑料托盘
工作台
网片
南京网片
镇江网片
苏州网片
南通网片
不锈钢管
不锈钢管
不锈钢管
不锈钢管
不锈钢管
不锈钢管
不锈钢管
不锈钢管
不锈钢管
不锈钢管
不锈钢管
不锈钢管
不锈钢管
不锈钢管
小游戏
激情电影
美容BB霜免费赠送
英语天地
手机游戏下载

设计之家
美容时尚网
美食在线
<p>轻型货架
轻型货架
轻型货架
轻型货架
轻型货架
中型货架
中型货架
中型货架
中型货架
重型货架
重型货架
载物台车
堆垛货架
巧固架
货架
货架
货架
固定小推车
手推车
双层静音推车
铁板手推车
手动液压平台车
提升机
单叉手动液压平台车
双叉手动液压平台车
多层框架车
登高车H1000
塑料托盘
登高车H1400
铁屑车
南京货架
货架
仓储货架
货架公司
货架厂
角钢货架
轻型货架
货架
南京货架
中型货架
重型货架
贯通货架
通廊货架
模具货架
抽屉货架
移动式货架
密集货架
立体货架
阁楼货架
悬臂货架
滚轮式货架
整理架
托盘
钢托盘
塑料托盘
仓储笼
上海仓储笼
江西仓储笼
料箱
钢制料箱
物流台车
登高车
工具柜
浙江工具柜
工具车
安徽工具车
工作台
整理柜
手推车
静音手推车
铁板手推车
搬运车
手动托盘搬运车
液压手动堆垛机
液压手推平台车
圆桶搬运车/油桶搬运车
电动托盘搬运车
高空拣选车
电动/电瓶叉车
库房货架
货架设计
轻型货架
角钢货架
中型货架
中量型货架
重型货架
重量型货架
托盘货架
贯通货架
通廊式货架
阁楼货架
悬臂式货架
模具货架
抽屉货架
辊轮式货架
移动式货架
网片
护栏
隔离网
工具柜
安全工具柜
工具车
移动工具车
置物柜
整理架
挂板架
工作台
线棒货架
输送轨道
输送轨道机
输送带
不锈钢制品
仓储笼
折叠式仓储笼
可堆周转箱
钢托盘
托盘
钢制托盘
网格料箱
料箱
钢料箱
钢制料箱
物流台车
重型货架
镇江塑料托盘
扬州塑料托盘
无锡塑料托盘
塑料托盘
求购货架
轻型货架
中型货架
托盘货架
贯通货架
马鞍山仓储笼
宁波重型货架
杭州轻型货架
杭州中型货架
杭州重型货架
杭州悬臂架
杭州4S店货架
宁波轻型货架
宁波中型货架
盐城货架
南通货架
苏州货架
镇江货架
南京货架
工业货架
嘉兴货架
常州货架
北京货架
辽宁货架
广东货架
河北货架
山西货架
吉林货架
湖南货架
福建货架
天津货架
部队货架
上海货架
青田货架
义乌货架
瑞安货架
温岭货架
舟山货架
诸暨货架
上虞货架
慈溪货架
余姚货架
奉化货架
海宁货架
嘉善货架
平湖货架
临安货架
建德货架
萧山货架
衢州货架
余杭货架
金华货架
温州货架
台州货架
绍兴货架
宁波货架
嘉兴货架
湖州货架
杭州货架
浙江货架
芜湖货架
合肥货架
安徽货架
威海货架
青岛货架
济南货架
山东货架
洛阳货架
河南货架
西安货架
陕西货架
四川货架
武汉货架
湖北货架
句容货架
仪征货架
江都货架
太仓货架
昆山货架
吴江货架
江阴货架
张家港货架
常熟货架
金坛货架
丹阳货架
无锡货架
常州货架
连云港货架
淮阴货架
徐州货架
东台货架
盐城货架
扬州货架
南通货架
苏州货架
镇江货架
南京货架
阁楼货架
模具货架
悬臂货架
重型货架
中型货架
轻型货架
张家港货架
江阴货架
海安货架
金坛货架
巢湖货架
芜湖货架
马鞍山货架
合肥货架
安徽货架
温岭货架
阁楼货架
悬臂货架
模具货架
重型货架
路桥货架
东营货架
临安货架
义乌货架
铜陵货架
诸暨货架
慈溪货架
余姚货架
余杭货架
萧山货架
海宁货架
衢州货架
金华货架
温州货架
台州货架
绍兴货架
宁波货架
湖州货架
嘉兴货架
浙江货架
杭州货架
上海货架
无锡货架
常州货架
淮阴货架
连云港货架
徐州货架
盐城货架
扬州货架
苏州货架
镇江货架
上海货架
南京货架
苏州货架
中型货架
轻型货架
合肥货架
安徽货架
威海货架
青岛货架
济南货架
山东货架
洛阳货架
河南货架
西安货架
陕西货架
四川货架
武汉货架
湖北货架
句容货架
仪征货架
江都货架
昆山货架
太仓货架
吴江货架
江阴货架
无锡货架
轻型货架
重型货架
中型货架
悬臂货架
模具货架
阁楼货架
丹阳货架
金坛货架
常熟货架
常州货架
淮阴货架
盐城货架
徐州货架
扬州货架
南通货架
苏州货架
南京货架
东台货架
中型货架
重型货架
轻型货架
苏州货架
悬臂货架
中型货架
轻型货架
中型货架
萧山货架
阁楼货架
昆山货架
温州货架
浙江货架
常州货架
南京货架
轻型货架
重型货架
海宁货架
奉化货架
余姚货架
慈溪货架
上虞货架
诸暨货架
舟山货架
温岭货架
瑞安货架
义乌货架
青田货架
上海货架
轻型货架
中型货架
重型货架
悬臂货架
模具货架
阁楼货架
工业货架
求购货架
马鞍山货架
铜陵货架
宣城货架
巢湖货架
浙江货架
杭州货架
湖州货架
嘉兴货架
宁波货架
绍兴货架
台州货架
温州货架
金华货架
余杭货架
衢州货架
萧山货架
建德货架
临安货架
平湖货架
嘉善货架
吴江货架
江阴货架
昆山货架
太仓货架
仪征货架
句容货架
湖北货架
武汉货架
四川货架
陕西货架
西安货架
河南货架
洛阳货架
山东货架
济南货架
青岛货架
威海货架
安徽货架
合肥货架
芜湖货架
南京货架
镇江货架
苏州货架
南通货架
扬州货架
盐城货架
徐州货架
淮阴货架
连云港货架
常州货架
东台货架
丹阳货架
金坛货架
常熟货架
张家港货架
江阴货架
仓储笼
瑞安货架
义乌货架
青田货架
上海货架
温岭货架
诸暨货架
慈溪货架
余姚货架
奉化货架
海宁货架
嘉善货架
平湖货架
临安货架
建德货架
萧山货架
衢州货架
余杭货架
金华货架
温州货架
山东货架
洛阳货架
河南货架
西安货架
合肥货架
安徽货架
威海货架
青岛货架
济南货架
芜湖货架
马鞍山货架
宣城货架
铜陵货架
浙江货架
巢湖货架
湖州货架
杭州货架
嘉兴货架
绍兴货架
宁波货架
台州货架
中型货架
阁楼货架
模具货架
悬臂货架
重型货架
工业货架
无锡货架
南京货架
南通货架
苏州货架
镇江货架
扬州货架
盐城货架
连云港货架
淮阴货架
徐州货架
金坛货架
丹阳货架
常州货架
张家港货架
常熟货架
昆山货架
吴江货架
江阴货架
太仓货架
句容货架
仪征货架
江都货架
武汉货架
湖北货架
四川货架
台州货架
轻型货架
杭州货架
湖州货架
杭州货架
隔离网片
贯通式货架
模具货架
悬臂货架
重型货架
中型货架
轻型货架
重型货架
悬臂货架
悬臂货架
悬臂货架
模具货架
模具货架
模具货架
4S店货架
4S店货架
阁楼货架
仓储笼
料箱
登高车
塑料托盘
轻型货架
轻型货架
轻型货架
中型货架
中型货架
中型货架
中型货架
角钢货架
轻型货架
轻型货架
中型货架
中型货架
重型货架
重型货架
模具货架
模具货架
悬臂货架
悬臂货架
阁楼货架
阁楼货架
料箱
料箱
仓储笼
仓储笼
贯通货架
网片
丽水仓储笼
余杭仓储笼
金华仓储笼
温州仓储笼
台州仓储笼
绍兴仓储笼
宁波仓储笼
嘉兴仓储笼
湖州仓储笼
杭州仓储笼
常州仓储笼
连云港仓储笼
淮阴仓储笼
徐州仓储笼
盐城仓储笼
扬州仓储笼
南通仓储笼
苏州仓储笼
镇江仓储笼
仓储笼
中型货架
中型货架
重型货架
重型货架
重型货架
重型货架
重型货架
模具货架
模具货架
模具货架
模具货架
模具货架
悬臂货架
悬臂货架
悬臂货架
悬臂货架
悬臂货架
阁楼货架
阁楼货架
阁楼货架
阁楼货架
轻型货架
中型货架
重型货架
海宁货架
常州料箱
连云港料箱
淮阴料箱
徐州料箱
盐城料箱
扬州料箱
南通钢制料箱
镇江料箱
南京料箱
无锡料箱
轻型货架
南通货架
轻型货架
重型货架
杭州货架
宁波货架
衢州货架
余姚货架
不锈钢管
不锈钢管
不锈钢管
不锈钢管
不锈钢管
不锈钢管
不锈钢管
不锈钢管
不锈钢管
不锈钢管
不锈钢管
不锈钢管
不锈钢管
不锈钢管
小游戏
激情电影
美容BB霜免费赠送
英语天地
手机游戏下载

设计之家
美容时尚网
美食在线
<p>重型货架
无锡货架
苏州货架
中型货架
重型货架
模具货架
悬臂货架
中型货架
重型货架
江都货架
泰州货架
太仓货架
昆山货架
吴江货架
张家港货架
常熟货架
溧阳货架
金坛货架
扬中货架
丹阳货架
淮阴货架
无锡货架
常州货架
徐州货架
轻型货架
上海货架
马鞍山货架
蚌埠货架
安徽货架
仪征货架
常熟货架
常州货架
盐城货架
南通货架
镇江货架
江苏货架
下沙货架
临安货架
义乌货架
嘉善货架
余姚货架
衢州货架
金华货架
台州货架
宁波货架
嘉兴货架
杭州货架
浙江货架
杭州货架
湖州货架
嘉兴货架
宁波货架
绍兴货架
杭州货架
湖州货架
嘉兴货架
绍兴货架
台州货架
液压搬运车
登高车
合肥货架
句容货架
太仓货架
金坛货架
徐州货架
镇江货架
苏州货架
常州货架
张家港货架
江阴货架
连云港货架
常州货架
无锡货架
丹阳货架
扬中货架
金坛货架
常熟货架
张家港货架
江阴货架
昆山货架
仪征货架
« PrevPage 1Next »

Add Comment